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
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
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.
Le type de données de la table Job (Varchar2 (20)) ne correspond pas à celui de la table USER (NUMBER NOT NULL).
Dans mon cas, le problème était dû à une PC invalide.
Pour l'activer:
Je cherche le nom de contrainte avec:
SELECT * FROM USER_CONS_COLUMNS WHERE TABLE_NAME = 'referenced_table_name';
Ensuite, j'ai pris le nom de contrainte afin de l'activer avec la commande suivante:
ALTER TABLE table_name ENABLE CONSTRAINT constraint_name;
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.
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.
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
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);
La différence entre votre déclaration de USERID n’est-elle pas le problème?
JOB: UserID is Varchar
USER: UserID is Number?