Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Oracle (ORA-02270):nenhuma chave exclusiva ou primária correspondente para este erro de lista de colunas


O erro ORA-2270 é um erro lógico direto:acontece quando as colunas que listamos na chave estrangeira não correspondem a uma chave primária ou restrição exclusiva na tabela pai. Razões comuns para isso são
  • o pai não tem uma restrição PRIMARY KEY ou UNIQUE completamente
  • a cláusula de chave estrangeira faz referência à coluna errada na tabela pai
  • a restrição da tabela pai é uma chave composta e não referenciamos todas as colunas na instrução de chave estrangeira.

Nem parece ser o caso em seu código postado. Mas isso é uma pista falsa, porque seu código não é executado como você postou. A julgar pelas edições anteriores, presumo que você não esteja postando seu código real, mas um exemplo simplificado. Infelizmente, no processo de simplificação, você erradicou o que está causando o erro 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> 

Essa instrução falhou porque USER é uma palavra-chave reservada, portanto, não podemos nomear uma tabela como USER. Vamos corrigir isso:
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> 

E olha! Sem erro ORA-2270.

Infelizmente, não há muito que possamos fazer aqui para ajudá-lo ainda mais. Você tem um bug no seu código. Você pode postar seu código aqui e um de nós pode identificar seu erro. Ou você pode verificar seu próprio código e descobri-lo por si mesmo.

Nota:uma versão anterior do código definiu HOB.USERID como VARCHAR2(20). Como USER.ID é definido como um NUMBER, a tentativa de criar uma chave estrangeira geraria um erro diferente:

ORA-02267:tipo de coluna incompatível com o tipo de coluna referenciado

Uma maneira fácil de evitar incompatibilidades é usar a sintaxe de chave estrangeira para padronizar o tipo de dados da coluna:
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
 );