sql >> Base de Datos >  >> RDS >> Oracle

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

El error ORA-2270 es un error lógico directo:sucede cuando las columnas que enumeramos en la clave externa no coinciden con una clave principal o una restricción única en la tabla principal. Las razones comunes para esto son

  • el padre carece por completo de una CLAVE PRINCIPAL o una restricción ÚNICA
  • la cláusula de clave externa hace referencia a la columna incorrecta en la tabla principal
  • la restricción de la tabla principal es una clave compuesta y no hemos hecho referencia a todas las columnas en la declaración de clave externa.

Tampoco parece ser el caso en su código publicado. Pero eso es una pista falsa, porque su código no se ejecuta como lo has publicado. A juzgar por las ediciones anteriores, supongo que no está publicando su código real, sino un ejemplo simplificado. Desafortunadamente, en el proceso de simplificación, ha erradicado lo que sea que esté causando el error 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> 

Esa declaración falló porque USUARIO es una palabra clave reservada, por lo que no podemos nombrar una tabla USUARIO. Arreglemos 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 he aquí! Sin error ORA-2270.

Por desgracia, no hay mucho que podamos hacer aquí para ayudarlo más. Tienes un error en tu código. Puede publicar su código aquí y uno de nosotros puede detectar su error. O puede comprobar su propio código y descubrirlo por sí mismo.

Nota:una versión anterior del código definía HOB.USERID como VARCHAR2(20). Debido a que USER.ID se define como un NÚMERO, el intento de crear una clave externa habría arrojado un error diferente:

ORA-02267:tipo de columna incompatible con el tipo de columna referenciado

Una forma sencilla de evitar las discrepancias es utilizar la sintaxis de clave externa para establecer por defecto el tipo de datos de la columna:

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