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