web-dev-qa-db-fra.com

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

J'ai deux tables, Table JOB et Table USER, voici la structure

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

Maintenant, je veux ajouter une contrainte de clé étrangère à la référence JOB à la table USER, comme 

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

cela jette Oracle (ORA-02270) : no matching unique or primary key for this column-list error, en faisant une enquête, il semble que nous ayons besoin de l'une ou l'autre des contraintes unique key or primary key sur USERID mais je ne peux pas l'avoir car un USERID peut avoir plusieurs JOBS associés, des idées ou des suggestions sur la façon de résoudre ce problème?

Recherché ORA-02270 et SO question connexe

15
Rachel

L'erreur ORA-2270 est très simple: elle survient lorsque les colonnes référencées dans la clé étrangère ne correspondent pas à une clé primaire ou à une contrainte unique sur la table parent. Les raisons courantes pour cela sont

  • le parent manque totalement de contrainte 
  • la contrainte de la table parent est une clé composée et nous n'avons pas référencé toutes les colonnes de la déclaration de clé étrangère.

Ni semble être le cas dans votre code posté. Mais c’est un pieu rouge, parce que votre code ne court pas comme vous l’avez posté. À en juger par les modifications précédentes, je suppose que vous ne postez pas votre code mais un exemple simplifié. Malheureusement, dans le processus de simplification, vous avez éradiqué la cause de l'erreur ORA-2270. 

Parce que, si nous corrigeons votre code pour qu'il fonctionne, il s'exécute. Tout le. 

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> 

Donc, cette instruction a échoué car USER est un mot clé réservé et nous ne pouvons pas nommer une table USER. Réglons 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.

Nous ne pouvons donc pas faire grand chose pour vous aider davantage. Vous avez un bug dans votre code. Vous pouvez poster votre code ici et l'un de nous peut détecter votre erreur. Ou vous pouvez vérifier votre propre code et le découvrir par vous-même. 

29
APC

Le type de données de la table Job (Varchar2 (20)) ne correspond pas à celui de la table USER (NUMBER NOT NULL).

8
LSU.Net

Dans mon cas, le problème était dû à une PC invalide.

Pour l'activer:

  1. Je cherche le nom de contrainte avec:

    SELECT * FROM USER_CONS_COLUMNS WHERE TABLE_NAME = 'referenced_table_name';

  2. Ensuite, j'ai pris le nom de contrainte afin de l'activer avec la commande suivante:

    ALTER TABLE table_name ENABLE CONSTRAINT constraint_name;

2
Lorenzo Lerate

Le schéma est correct, User.ID doit être la clé primaire de User, Job.ID doit être la clé primaire de Job et Job.UserID doit être une clé étrangère à User.ID. De plus, vos commandes semblent être syntaxiquement correctes.

Alors qu'est-ce qui pourrait mal se passer? Je crois que vous avez au moins un Job.UserID qui n'a pas de paire dans User.ID. Par exemple, si toutes les valeurs de User.ID sont: 1,2,3,4,6,7,8 et que vous avez une valeur de Job.UserID de 5 (ce qui n’est pas entre 1,2,3,4,6). , 7,8, qui sont les valeurs possibles de UserID), vous ne pourrez pas créer votre contrainte de clé étrangère. Solution:

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

supprimera tous les travaux avec des utilisateurs non existants. Vous voudrez peut-être les migrer vers une copie de cette table qui contiendra les données d'archive.

2
Lajos Arpad

Le plus probablement quand vous avez une clé primaire manquante n'est pas définie à partir de la table parent. alors il se produit.

J'aime Ajoutez la clé primaire, définissez-la dans le parent comme ci-dessous: 

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

J'espère que cela fonctionnera.

2
Navin

J'ai rencontré le même problème dans mon scénario comme suit:

J'ai d'abord créé un tableau avec

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

Puis table de chapitre:

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

Puis table de sujet:

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

Maintenant, lorsque je voulais créer une relation appelée chapitre_topic entre chapitre (avec une clé primaire composite) et sujet (avec une clé primaire à une colonne), j'ai rencontré un problème avec la requête suivante:

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

La solution consistait à faire référence à la clé étrangère composite comme ci-dessous:

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

Merci au courrier d’APC dans lequel il a mentionné dans son message une déclaration selon laquelle:

Les raisons courantes pour cela sont 
- le parent manque totalement de contrainte 
- la contrainte de la table parente est une clé composée et nous n'avons pas référencé toutes les colonnes de la déclaration de clé étrangère.
- la contrainte de PK référencée existe mais est DÉSACTIVÉE

1
chetan pawar

Si la clé primaire n'est pas déjà définie sur la table parente, ce problème peut survenir. S'il vous plaît essayez de définir la clé primaire sur la table existante. Par exemple:

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

La différence entre votre déclaration de USERID n’est-elle pas le problème?

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