sql >> Database >  >> RDS >> Oracle

Oracle (ORA-02270):geen overeenkomende unieke of primaire sleutel voor deze kolomlijstfout

De ORA-2270-fout is een rechttoe rechtaan logische fout:het gebeurt wanneer de kolommen die we in de externe sleutel vermelden, niet overeenkomen met een primaire sleutel of unieke beperking in de bovenliggende tabel. Veelvoorkomende redenen hiervoor zijn

  • de ouder heeft helemaal geen PRIMAIRE SLEUTEL of UNIEKE beperking
  • de clausule van de refererende sleutel verwijst naar de verkeerde kolom in de bovenliggende tabel
  • De beperking van de bovenliggende tabel is een samengestelde sleutel en we hebben niet naar alle kolommen in de refererende-sleutelinstructie verwezen.

Geen van beide lijkt het geval te zijn in uw geposte code. Maar dat is een rode haring, omdat uw code niet wordt uitgevoerd zoals je het hebt gepost. Afgaande op de vorige bewerkingen neem ik aan dat je niet je eigenlijke code plaatst, maar een vereenvoudigd voorbeeld. Helaas heb je tijdens het vereenvoudigingsproces alles uitgeroeid dat de ORA-2270-fout veroorzaakt.

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> 

Die instructie is mislukt omdat USER een gereserveerd sleutelwoord is, dus we kunnen een tabel USER niet noemen. Laten we dat oplossen:

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> 

En zie! Geen ORA-2270-fout.

Helaas kunnen we hier niet veel doen om u verder te helpen. Je hebt een bug in je code. U kunt uw code hier posten en een van ons kan uw fout zien. Of u kunt uw eigen code controleren en zelf ontdekken.

Opmerking:een eerdere versie van de code definieerde HOB.USERID als VARCHAR2(20). Omdat USER.ID is gedefinieerd als een NUMBER, zou de poging om een ​​externe sleutel te maken een andere fout hebben veroorzaakt:

ORA-02267:kolomtype incompatibel met kolomtype waarnaar wordt verwezen

Een gemakkelijke manier om mismatches te voorkomen, is door de syntaxis van de refererende sleutel te gebruiken om het datatype van de kolom standaard te maken:

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
 );


  1. ClusterControl - Geavanceerd back-upbeheer - mariabackup deel III

  2. Gegevenstype van veld ophalen in select-instructie in ORACLE

  3. SQL Server CRUD-bewerkingen

  4. Door de gebruiker gedefinieerd type wijzigen in SQL Server