Chyba ORA-2270 je přímočará logická chyba:dochází k ní, když sloupce, které uvádíme v cizím klíči, neodpovídají primárnímu klíči nebo jedinečnému omezení v nadřazené tabulce. Běžné důvody pro to jsou
- rodič vůbec postrádá PRIMÁRNÍ KLÍČ nebo UNIKÁTNÍ omezení
- klauzule cizího klíče odkazuje na nesprávný sloupec v nadřazené tabulce
- Omezení nadřazené tabulky je složený klíč a neodkazovali jsme na všechny sloupce v příkazu cizího klíče.
Zdá se, že ve vašem odeslaném kódu tomu tak není. Ale to je červený sleď, protože váš kód nefunguje jak jste to zveřejnili. Soudě podle předchozích úprav předpokládám, že nezveřejňujete svůj skutečný kód, ale nějaký zjednodušený příklad. Bohužel v procesu zjednodušování jste vymýtili vše, co způsobuje chybu 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>
Tento příkaz selhal, protože USER je vyhrazené klíčové slovo, takže nemůžeme pojmenovat tabulku jako USER. Pojďme to napravit:
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>
A hle! Žádná chyba ORA-2270.
Bohužel, tady toho moc nemůžeme udělat, abychom vám pomohli dále. Máte chybu v kódu. Zde můžete vložit svůj kód a jeden z nás si všimne vaší chyby. Nebo si můžete zkontrolovat svůj vlastní kód a objevit ho sami.
Poznámka:dřívější verze kódu definovala HOB.USERID jako VARCHAR2(20). Protože USER.ID je definováno jako ČÍSLO, pokus o vytvoření cizího klíče by způsobil jinou chybu:
ORA-02267:typ sloupce nekompatibilní s odkazovaným typem sloupce
Snadný způsob, jak se vyhnout neshodám, je použít syntaxi cizího klíče k výchozímu datovému typu sloupce:
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
);