Oracle
 sql >> Database >  >> RDS >> Oracle

Oracle (ORA-02270):nessuna chiave univoca o primaria corrispondente per questo errore di elenco di colonne

L'errore ORA-2270 è un semplice errore logico:si verifica quando le colonne che elenchiamo nella chiave esterna non corrispondono a una chiave primaria oa un vincolo univoco sulla tabella padre. Le ragioni comuni per questo sono

  • al genitore manca del tutto un vincolo PRIMARY KEY o UNIQUE
  • la clausola della chiave esterna fa riferimento alla colonna sbagliata nella tabella padre
  • il vincolo della tabella padre è una chiave composta e non abbiamo fatto riferimento a tutte le colonne nell'istruzione della chiave esterna.

Nessuno dei due sembra essere il caso nel tuo codice pubblicato. Ma questa è una falsa pista, perché il tuo codice non viene eseguito come l'hai postato. A giudicare dalle modifiche precedenti, presumo che tu non stia pubblicando il tuo codice effettivo ma qualche esempio semplificato. Sfortunatamente nel processo di semplificazione hai sradicato qualunque cosa stia causando l'errore ORA-2270.

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> 

Questa istruzione non è riuscita perché USER è una parola chiave riservata, quindi non possiamo nominare una tabella USER. Risolviamolo:

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> 

Ed ecco! Nessun errore ORA-2270.

Purtroppo, non c'è molto che possiamo fare qui per aiutarti ulteriormente. Hai un bug nel tuo codice. Puoi pubblicare il tuo codice qui e uno di noi può individuare il tuo errore. Oppure puoi controllare il tuo codice e scoprirlo da solo.

Nota:una versione precedente del codice definiva HOB.USERID come VARCHAR2(20). Poiché USER.ID è definito come NUMBER, il tentativo di creare una chiave esterna avrebbe generato un errore diverso:

ORA-02267:tipo di colonna incompatibile con il tipo di colonna di riferimento

Un modo semplice per evitare mancate corrispondenze consiste nell'utilizzare la sintassi della chiave esterna per impostare come predefinito il tipo di dati della colonna:

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