Oracle (ORA-02270): ninguna clave primaria o única coincidente para este error de lista de columnas

Tengo dos tablas, Table JOB y Table USER , aquí está la estructura

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

Ahora, quiero agregar una restricción de clave foránea a la referencia de JOB a la tabla USER , como

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

esto arroja Oracle (ORA-02270) : no matching unique or primary key for this column-list error , haciendo alguna investigación parece que necesitamos tener una unique key or primary key restricción de unique key or primary key en USERID pero no puedo tener eso como un USERID puede tener múltiples JOBS asociados con él, algún pensamiento o sugerencia sobre cómo solucionar este problema?

Investigación ORA-02270 y pregunta relacionada con SO

El error ORA-2270 es bastante simple: ocurre cuando las columnas a las que hacemos referencia en la clave externa no coinciden con una clave primaria o una restricción única en la tabla padre. Las razones comunes de esto son

  • el padre carece de una restricción por completo
  • la restricción de la tabla principal es una clave compuesta y no hemos hecho referencia a todas las columnas en la statement de clave externa.

Ninguno parece ser el caso en su código publicado. Pero eso es una pista falsa, porque su código no se ejecuta como lo ha publicado. A juzgar por las ediciones anteriores, supongo que no está publicando su código real, sino un ejemplo simplificado. Lamentablemente, en el proceso de simplificación, ha erradicado todo lo que está causando el error ORA-2270.

Porque, si arreglamos su código para que se ejecute, se … ejecuta. Todo el camino

 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> 

Entonces, esa statement falló porque USER es una palabra clave reservada, y no podemos nombrar una tabla USER. Arreglemos eso:

 SQL> 1 1* CREATE TABLE USER SQL> as 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> 

Y he aquí! Sin error ORA-2270.

Por lo tanto, no hay mucho que podamos hacer aquí para ayudarlo más. Usted tiene un error en su código. Puede publicar su código aquí y uno de nosotros puede detectar su error. O puede verificar su propio código y descubrirlo por usted mismo.

El tipo de datos en la tabla de tareas (Varchar2 (20)) no coincide con el tipo de datos en la tabla USER (NUMBER NOT NULL).

El esquema es correcto, User.ID debe ser la clave principal del usuario, Job.ID debe ser la clave primaria de Job y Job. UserID debe ser una clave externa para User.ID. Además, sus comandos parecen ser sintácticamente correctos.

Entonces, ¿qué podría estar mal? Creo que tiene al menos un Job.UserID que no tiene un par en User.ID. Por ejemplo, si todos los valores de User.ID son: 1,2,3,4,6,7,8 y tiene un valor de Job.UserID de 5 (que no está entre 1,2,3,4,6 , 7,8, que son los valores posibles de UserID), no podrá crear su restricción de clave externa. Solución:

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

eliminará todos los trabajos con usuarios inexistentes. Es posible que desee migrarlos a una copia de esta tabla que contendrá datos de archivo.

Lo más probable es que cuando tenga una clave principal faltante no esté definida desde la tabla padre. entonces ocurre.

Al igual que Agregar la clave primaria, defina en el elemento primario como se muestra a continuación:

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

Espero que esto funcione

Me enfrenté al mismo problema en mi escenario de la siguiente manera:

Creé la mesa de libros de texto primero con

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

Luego tabla de capítulos:

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

Luego tabla de temas:

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

Ahora cuando quería crear una relación llamada chapter_topic entre chapter (tener clave primaria compuesta) y topic (tener clave primaria de columna única), tuve problemas con la siguiente consulta:

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 solución fue hacer referencia a la clave foránea compuesta de la siguiente manera:

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

Gracias a la publicación de APC en la que mencionó en su post una statement de que:

Las razones comunes de esto son
– el padre carece de una restricción por completo
– la restricción de la tabla padre es una clave compuesta y no hemos hecho referencia a todas las columnas en la statement de clave foránea.
– la restricción PK referenciada existe, pero está DESACTIVADA

¿No es la diferencia entre su statement de USERID el problema?

 JOB: UserID is Varchar USER: UserID is Number? 

En mi caso, el problema fue causado por un PK deshabilitado.

Para habilitarlo:

  1. Busco el nombre de Restricción con:

    SELECT * FROM USER_CONS_COLUMNS WHERE TABLE_NAME = 'referenced_table_name';

  2. Luego tomé el nombre de Restricción para habilitarlo con el siguiente comando:

    ALTER TABLE table_name ENABLE CONSTRAINT constraint_name;

 create table articles(code varchar2(30)constraint articles_pk primary key,titre varchar2(30), support varchar2(30) constraint support_fk references supports(support),type_support varchar2(30), numeroDePage varchar2(30),datepublication date,categorie varchar2(30)constraint categorie_fk references organismes(categorie), tendance varchar2(30)constraint tendance_fk references apreciations(tendance));