Грешката ORA-2270 е проста логическа грешка:случва се, когато колоните, които изброяваме във външния ключ, не съвпадат с първичен ключ или уникално ограничение на родителската таблица. Честите причини за това са
- на родителя липсва ограничение PRIMARY KEY или UNIQUE
- клаузата за външен ключ препраща към грешната колона в родителската таблица
- Ограничението на родителската таблица е съставен ключ и не сме посочили всички колони в израза за външен ключ.
Изглежда, че не е така във вашия публикуван код. Но това е червена херинга, защото вашият код не се изпълнява както сте го публикували. Съдейки от предишните редакции, предполагам, че не публикувате действителния си код, а някакъв опростен пример. За съжаление в процеса на опростяване сте премахнали всичко, което причинява грешката 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>
Това изявление се провали, защото USER е запазена ключова дума, така че не можем да именуваме таблица USER. Нека поправим това:
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>
И ето! Няма грешка ORA-2270.
Уви, тук не можем да направим много, за да ви помогнем допълнително. Имате грешка в кода си. Можете да публикувате кода си тук и някой от нас може да открие грешката ви. Или можете да проверите собствения си код и да го откриете сами.
Забележка:по-ранна версия на кода дефинира HOB.USERID като VARCHAR2(20). Тъй като USER.ID е дефиниран като NUMBER, опитът за създаване на външен ключ би довел до друга грешка:
ORA-02267:тип колона несъвместим с рефериран тип колона
Лесен начин да избегнете несъответствия е да използвате синтаксиса на външния ключ за подразбиране на типа данни на колоната:
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
);