Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Oracle (ORA-02270):kein übereinstimmender eindeutiger oder primärer Schlüssel für diesen Spaltenlistenfehler

Der Fehler ORA-2270 ist ein einfacher logischer Fehler:Er tritt auf, wenn die Spalten, die wir im Fremdschlüssel auflisten, 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 PRIMARY KEY- oder UNIQUE-Einschränkung
  • die Fremdschlüsselklausel verweist auf die falsche Spalte in der übergeordneten Tabelle
  • Die Einschränkung der übergeordneten Tabelle ist ein zusammengesetzter Schlüssel und wir haben nicht auf alle Spalten in der Fremdschlüsselanweisung verwiesen.

Beides scheint in Ihrem geposteten Code nicht der Fall zu sein. Aber das ist ein Ablenkungsmanöver, denn Ihr Code läuft nicht wie du es gepostet hast. Nach den vorherigen Änderungen zu urteilen, nehme ich an, dass Sie nicht Ihren tatsächlichen Code, sondern ein vereinfachtes Beispiel veröffentlichen. Leider haben Sie im Zuge der Vereinfachung die Ursache des ORA-2270-Fehlers beseitigt.

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 fehlgeschlagen, weil USER ein reserviertes Schlüsselwort ist, sodass wir eine Tabelle nicht 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.

Leider können wir hier nicht viel tun, um Ihnen weiter zu helfen. 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.

Hinweis:Eine frühere Version des Codes definierte HOB.USERID als VARCHAR2(20). Da USER.ID als ZAHL definiert ist, hätte der Versuch, einen Fremdschlüssel zu erstellen, einen anderen Fehler ausgegeben:

ORA-02267:Spaltentyp nicht kompatibel mit referenziertem Spaltentyp

Eine einfache Möglichkeit, Diskrepanzen zu vermeiden, besteht darin, die Fremdschlüsselsyntax zu verwenden, um den Datentyp der Spalte vorzugeben:

CREATE TABLE USERs
 (
   ID    number NOT NULL ,
   CONSTRAINT U_PK PRIMARY KEY ( ID ) ENABLE
 );

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