2012-05-29 11 views
11

Tengo dos tablas, Table JOB y Table USER, aquí es la estructuraOracle (ORA-02270): no coinciden con la clave única o primaria para esta columna-lista de errores

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 añadir clave externa JOB limitación para hacer referencia a USER mesa, 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 un poco de investigación, parece que tenemos que tener bien unique key or primary key restricción en USERID pero no puedo tenerlo como uno USERID puede tener múltiples JOBS asociados a él, ¿algún comentario o sugerencia sobre cómo solucionar este problema?

Investigado ORA-02270 y SO related question

+0

Sugerencia: suelte estas tablas y luego vuelva a ejecutar el DDL. Sugiero crear primero USER y luego JOB. Permítanos saber si funciona. También puede tratar de poner "USUARIO" entre comillas dobles, como se señala en el comentario de @ LSU.Net a la primera respuesta (a continuación). –

+0

@APC: Primero, no pretendo perder el tiempo de las comunidades, valoro los esfuerzos que la comunidad está haciendo. Además de eso, no sé dónde se genera el error y, por lo tanto, tengo problemas. – Rachel

Respuesta

23

El error ORA-2270 es bastante simple: sucede 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 más comunes para ello son

  • el padre carece de una restricción por completo
  • limitación de la tabla primaria es una clave compuesta y no hemos referenciado todas las columnas de la cuenta de clave externa.

Tampoco parece ser el caso en el 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 corregimos 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 declaración falló porque USER es una palabra clave reservada, y no podemos nombrar una tabla USER.Vamos a arreglar eso:

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> 

Y lo! Sin error ORA-2270.

Por lo tanto, no hay mucho que podamos hacer aquí para ayudarlo. 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.

+15

"... claramente no lo has entendido. El error es bastante simple:" Nosotros (todos nosotros) hacemos bien en encontrar mejores y mejores formas de comunicación que esta. –

8

El tipo de datos en la tabla de Trabajo (Varchar2 (20)) no coincide con el tipo de datos en la tabla de usuario (número de NOT NULL).

+0

+1 Bien manchado. – JHS

+0

debería haberlo mencionado por adelantado, tanto id como userid son tipo de número. – Rachel

+1

Tienes algún otro problema Rachel, creé las dos tablas junto con la restricción FK y funciona bien. Tenga en cuenta que "USUARIO" necesita escapes de cotizaciones y sus claves principales también tienen nombres de restricción idénticos, que es DDL no válido. –

0

no es la diferencia entre su declaración de IDUSUARIO el problema

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

he rectificado el error en cuestión, tanto ID de usuario como ID son números – Rachel

2

El esquema es correcto, User.ID debe ser la clave principal de usuario, Job.ID debe ser la clave primaria de Trabajo 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.

1

que enfrentan el mismo problema en mi escenario de la siguiente manera:

creé mesa de libros de texto en primer lugar con

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

Entonces mesa capítulo:

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

mesa Entonces tema:

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

Ahora, cuando yo quería crear una relación llamada chapter_topic entre el capítulo (con clave compuesta primaria) y tema (con columna de clave principal y único), enfrenté problema con 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 para referirse a la clave externa 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 APC post en el que menciona en su puesto un comunicado que:

Las razones más comunes para ello son
- el padre carece de una restricción por completo
- limitación de la tabla primaria es una clave compuesta y no hemos referenciado todas las columnas de la cuenta de clave externa.

2

Más Probablemente cuando no se tiene una clave principal no se define desde la tabla principal. entonces ocurre.

Como Añada la clave primaria definen en la matriz de la siguiente manera:

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

la esperanza que esto funcionará.

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

En mi caso, el problema se debía a una PK deshabilitada.

el fin de permitir que:

  1. busco el nombre de restricción con:

    SELECT * FROM USER_CONS_COLUMNS WHERE TABLE_NAME = 'referenced_table_name';

  2. Tomé entonces el nombre de restricción con el fin de activarlo con el siguiente comando :

    ALTER TABLE table_name ENABLE CONSTRAINT constraint_name;

Cuestiones relacionadas