webentwicklung-frage-antwort-db.com.de

Oracle (ORA-02270): Kein übereinstimmender eindeutiger Schlüssel oder Primärschlüssel für diesen Spaltenlistenfehler

Ich habe zwei Tabellen, Table JOB und Table USER, hier ist die Struktur

 CREATE TABLE JOB
 (
   ID       NUMBER NOT NULL ,
   USERID   NUMBER,
   CONSTRAINT B_PK PRIMARY KEY ( ID ) ENABLE
 );

 CREATE TABLE USER
 (
   ID       NUMBER NOT NULL ,
   CONSTRAINT U_PK PRIMARY KEY ( ID ) ENABLE
 );

Nun möchte ich Fremdschlüsseleinschränkung zu JOB hinzufügen, die auf USER-Tabelle als verweist 

Alter Table JOB ADD CONSTRAINT FK_USERID FOREIGN KEY(USERID) REFERENCES USER(ID);

dies wirft Oracle (ORA-02270) : no matching unique or primary key for this column-list error ab. Nach einigen Untersuchungen scheint es, dass wir entweder unique key or primary key-Einschränkung für USERID haben müssen, aber ich kann das nicht haben, da USERID mehrere JOBS zugeordnet werden kann.

Recherchierte ORA-02270 und SO - verwandte Frage

15
Rachel

Der ORA-2270-Fehler ist recht einfach: Er tritt auf, wenn die im Fremdschlüssel referenzierten Spalten nicht mit einem Primärschlüssel oder einer eindeutigen Einschränkung in der übergeordneten Tabelle übereinstimmen. Häufige Gründe dafür sind

  • dem übergeordneten Element fehlt insgesamt eine Einschränkung 
  • die Einschränkung der übergeordneten Tabelle ist ein zusammengesetzter Schlüssel, und wir haben nicht alle Spalten in der Fremdschlüsselanweisung referenziert.

In Ihrem veröffentlichten Code scheint dies nicht der Fall zu sein. Aber das ist ein roter Hering, weil dein Code nicht läuft wie du ihn gepostet hast. Nach den vorherigen Änderungen zu urteilen, nehme ich an, dass Sie nicht Ihren tatsächlichen Code veröffentlichen, sondern ein vereinfachtes Beispiel. Leider haben Sie im Zuge der Vereinfachung den Fehler ORA-2270 beseitigt. 

Wenn wir Ihren Code so korrigieren, dass er ausgeführt wird, wird er ausgeführt. Den ganzen Weg. 

SQL> CREATE TABLE JOB
 (
   ID       NUMBER NOT NULL ,
   USERID   NUMBER,
   CONSTRAINT B_PK PRIMARY KEY ( ID ) ENABLE
 );  2    3    4    5    6  

Table created.

SQL> CREATE TABLE USER
 (
   ID       NUMBER NOT NULL ,
   CONSTRAINT U_PK PRIMARY KEY ( ID ) ENABLE
 );  2    3    4    5  
CREATE TABLE USER
             *
ERROR at line 1:
ORA-00903: invalid table name


SQL> 

Diese Anweisung ist daher fehlgeschlagen, da USER ein reserviertes Schlüsselwort ist und wir keine Tabelle USER nennen können. Lassen Sie uns das beheben:

SQL> 1
  1* CREATE TABLE USER
SQL> a s
  1* CREATE TABLE USERs
SQL> l
  1  CREATE TABLE USERs
  2   (
  3     ID       NUMBER NOT NULL ,
  4     CONSTRAINT U_PK PRIMARY KEY ( ID ) ENABLE
  5*  )
SQL> r
  1  CREATE TABLE USERs
  2   (
  3     ID       NUMBER NOT NULL ,
  4     CONSTRAINT U_PK PRIMARY KEY ( ID ) ENABLE
  5*  )

Table created.

SQL> Alter Table JOB ADD CONSTRAINT FK_USERID FOREIGN KEY(USERID) REFERENCES USERS(ID);   

Table altered.

SQL> 

Und siehe da! Kein ORA-2270-Fehler.

Wir können hier also nicht viel tun, um Ihnen weiterzuhelfen. Sie haben einen Fehler in Ihrem Code. Sie können Ihren Code hier posten und einer von uns kann Ihren Fehler erkennen. Oder Sie können Ihren eigenen Code überprüfen und ihn selbst entdecken. 

29
APC

Der Datentyp in der Jobtabelle (Varchar2 (20)) stimmt nicht mit dem Datentyp in der USER-Tabelle (NUMBER NOT NULL) überein.

8
LSU.Net

In meinem Fall wurde das Problem durch eine deaktivierte PK verursacht.

Um es zu ermöglichen:

  1. Ich suche den Constraint-Namen mit:

    SELECT * FROM USER_CONS_COLUMNS WHERE TABLE_NAME = 'referenced_table_name';

  2. Dann nahm ich den Constraint-Namen, um ihn mit dem folgenden Befehl zu aktivieren:

    ALTER TABLE table_name ENABLE CONSTRAINT constraint_name;

2
Lorenzo Lerate

Das Schema ist korrekt, User.ID muss der Primärschlüssel von User sein, Job.ID sollte der Primärschlüssel von Job sein und Job.UserID sollte ein Fremdschlüssel für User.ID sein. Außerdem scheinen Ihre Befehle syntaktisch korrekt zu sein.

Was könnte also falsch sein? Ich glaube, Sie haben mindestens eine Job.UserID, die in User.ID kein Paar hat. Zum Beispiel, wenn alle Werte von User.ID: 1,2,3,4,6,7,8 sind und Sie einen Job.UserID-Wert von 5 haben (der nicht unter 1,2,3,4,6 liegt) , 7,8 (die möglichen Werte von UserID), können Sie Ihre Fremdschlüsseleinschränkung nicht erstellen. Lösung:

delete from Job where UserID in (select distinct User.ID from User);

löscht alle Jobs mit nicht vorhandenen Benutzern. Möglicherweise möchten Sie diese zu einer Kopie dieser Tabelle migrieren, die Archivdaten enthält.

2
Lajos Arpad

Wenn Sie einen fehlenden Primärschlüssel haben, wird dieser wahrscheinlich nicht in der übergeordneten Tabelle definiert. dann tritt es auf.

So fügen Sie den Primärschlüssel in übergeordnetem Element wie folgt hinzu: 

ALTER TABLE "FE_PRODUCT" ADD CONSTRAINT "FE_PRODUCT_PK" PRIMARY KEY ("ID") ENABLE;

Hoffe das wird funktionieren.

2
Navin

Ich hatte in meinem Szenario das gleiche Problem wie folgt:

Ich habe zuerst eine Lehrbuchtabelle mit erstellt

create table textbook(txtbk_isbn varchar2(13)
primary key,txtbk_title varchar2(40),
txtbk_author varchar2(40) );

Dann Kapiteltabelle:

create table chapter(txtbk_isbn varchar2(13),chapter_title varchar2(40), constraint pk_chapter primary key(txtbk_isbn,chapter_title), constraint chapter_txtbook foreign key (txtbk_isbn) references textbook (txtbk_isbn));

Dann Thementabelle:

create table topic(topic_id varchar2(20) primary key,topic_name varchar2(40));

Als ich nun eine Beziehung namens chapter_topic zwischen Kapitel (mit zusammengesetztem Primärschlüssel) und Thema (mit einspaltigem Primärschlüssel) erstellen wollte, stand ich mit der folgenden Abfrage vor einem Problem:

create table chapter_topic(txtbk_isbn varchar2(13),chapter_title varchar2(40),topic_id varchar2(20), primary key (txtbk_isbn, chapter_title, topic_id), foreign key (txtbk_isbn) references textbook(txtbk_isbn), foreign key (chapter_title) references chapter(chapter_title), foreign key (topic_id) references topic (topic_id));

Die Lösung bestand darin, sich wie folgt auf den zusammengesetzten Fremdschlüssel zu beziehen:

create table chapter_topic(txtbk_isbn varchar2(13),chapter_title varchar2(40),topic_id varchar2(20), primary key (txtbk_isbn, chapter_title, topic_id), foreign key (txtbk_isbn, chapter_title) references chapter(txtbk_isbn, chapter_title), foreign key (topic_id) references topic (topic_id));

Dank an APC post, in dem er in seinem Beitrag eine Erklärung erwähnte, dass:

Häufige Gründe dafür sind 
- Dem Elternteil fehlt insgesamt eine Einschränkung 
- Die Einschränkung der übergeordneten Tabelle ist ein zusammengesetzter Schlüssel, und wir haben nicht alle Spalten in der Fremdschlüsselanweisung referenziert.
- Die referenzierte PK-Einschränkung existiert, ist jedoch DEAKTIVIERT

1
chetan pawar

Wenn Sie diesen Befehl ausführen:

ALTER TABLE MYTABLENAME MODIFY CONSTRAINT MYCONSTRAINTNAME_FK ENABLE;

Ich habe diesen Fehler bekommen:

ORA-02270: no matching unique or primary key for this column-list
02270. 00000 -  "no matching unique or primary key for this column-list"
*Cause:    A REFERENCES clause in a CREATE/ALTER TABLE statement
          gives a column-list for which there is no matching unique or primary
          key constraint in the referenced table.
*Action:   Find the correct column names using the ALL_CONS_COLUMNS

Die referenzierte Tabelle verfügt über eine Primärschlüsseleinschränkung mit dem passenden Typ. Die Hauptursache für diesen Fehler war in meinem Fall, dass die Primärschlüsseleinschränkung deaktiviert war.

0
Amy B

Wenn der Primärschlüssel nicht bereits in der übergeordneten Tabelle definiert ist, kann dieses Problem auftreten. Versuchen Sie bitte, den Primärschlüssel in einer vorhandenen Tabelle zu definieren. Zum Beispiel:

ALTER TABLE table_name
ADD PRIMARY KEY (the_column_which_is_primary_key);
0
Shivendra Gupta

Ist der Unterschied zwischen Ihrer Deklaration von USERID nicht das Problem?

JOB: UserID is Varchar
USER: UserID is Number?
0
codingbiz