Oracle
 sql >> Base de données >  >> RDS >> Oracle

Oracle (ORA-02270) :aucune clé unique ou primaire correspondante pour cette erreur de liste de colonnes

L'erreur ORA-2270 est une erreur logique simple :elle se produit lorsque les colonnes que nous listons dans la clé étrangère ne correspondent pas à une clé primaire ou à une contrainte unique sur la table parent. Les raisons courantes à cela sont

  • il manque complètement au parent une contrainte PRIMARY KEY ou UNIQUE
  • la clause de clé étrangère fait référence à la mauvaise colonne dans la table parent
  • la contrainte de la table parent est une clé composée et nous n'avons pas référencé toutes les colonnes dans l'instruction de clé étrangère.

Ni l'un ni l'autre ne semble être le cas dans votre code posté. Mais c'est un faux-fuyant, car votre code ne s'exécute pas comme vous l'avez posté. À en juger par les modifications précédentes, je suppose que vous ne publiez pas votre code réel, mais un exemple simplifié. Malheureusement, dans le processus de simplification, vous avez supprimé tout ce qui cause l'erreur 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> 

Cette instruction a échoué car USER est un mot-clé réservé, nous ne pouvons donc pas nommer une table USER. Corrigeons cela :

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> 

Et voilà ! Aucune erreur ORA-2270.

Hélas, nous ne pouvons pas faire grand-chose ici pour vous aider davantage. Vous avez un bogue dans votre code. Vous pouvez poster votre code ici et l'un de nous pourra repérer votre erreur. Ou vous pouvez vérifier votre propre code et le découvrir par vous-même.

Remarque :une version antérieure du code définissait HOB.USERID comme VARCHAR2(20). Étant donné que USER.ID est défini comme un NUMBER, la tentative de création d'une clé étrangère aurait généré une erreur différente :

ORA-02267 :type de colonne incompatible avec le type de colonne référencé

Un moyen simple d'éviter les incompatibilités consiste à utiliser la syntaxe de clé étrangère pour définir par défaut le type de données de la colonne :

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