2011-07-06 17 views
11

Mam złożony klucz podstawowy w 1 tabeli w wyroczni. Chcę utworzyć klucz obcy dla jednego wpisu tabeli w mojej drugiej tabeli, który odwołuje się do złożonego klucza podstawowego w pierwszej tabeli. Otrzymuję błąd ORA-02256. Wszelkie przemyślenia na temat tego, jak mogę to zrobić?Oracle złożony klucz podstawowy/klucz obcego pytania

CREATE TABLE groupspersonx ( 
    personid number, 
    groupid number, 
    CONSTRAINT pk_persongroupid PRIMARY KEY(personid, groupid) 
); 

CREATE TABLE restrictedgroups ( 
    groupid number, 
    name varchar2(50), 
    dateadded date, 
    since date, 
    notes varchar2(1024), 
    CONSTRAINT pk_groupid PRIMARY KEY(groupid), 
    CONSTRAINT fk_persongroup FOREIGN KEY(groupid) REFERENCES groupspersonx(personid, groupid) 
); 
+0

create table groupspersonx ( \t personid \t Numer , \t groupid \t \t \t numer, \t CONSTRAINT pk_persongroupid PRIMARY KEY (personid, groupid) ); tworzyć restrictedgroups stołowe ( \t GroupID \t \t \t numer, \t nazwa \t \t \t varchar2 (50), \t dateadded \t \t datę \t od \t \t \t data, \t notatki \t \t \t varchar2 (1024) , \t CONSTRAINT pk_groupid PRIMARY KEY (groupid), CONSTRAINT fk_persongroup FOREIGN KEY (groupid) REFERENCJE groupspersonx (personid, groupid) ); – Christopher

Odpowiedz

18

Błąd polega na tym, że klucz OBCY jest jedną kolumną, ale próbujesz podać dwie kolumny jako rodzic. Nie ma potrzeby, aby związać z kluczem kompozytowego, ponieważ restrictedgroups nie posiada kolumnę personid ...

Trzeba również zależność wstecz - wykorzystanie:

CREATE TABLE restrictedgroups ( 
    groupid number, 
    name varchar2(50), 
    dateadded date, 
    since date, 
    notes varchar2(1024), 
    CONSTRAINT pk_groupid PRIMARY KEY(groupid) 
); 

CREATE TABLE groupspersonx ( 
    personid number, 
    groupid number, 
    CONSTRAINT pk_persongroupid PRIMARY KEY(personid, groupid), 
    CONSTRAINT fk_persongroup FOREIGN KEY(groupid) REFERENCES restrictedgroups(groupid) 
); 

Dodam klucz obcy dla każdego stołu, z którego pochodziłby personid.

+0

Widzę teraz, wielkie dzięki! – Christopher

0

nie można używać:

CONSTRAINT fk_persongroup FOREIGN KEY(groupid) REFERENCES groupspersonx(personid, groupid) 

Zmień że zbyt:

CONSTRAINT fk_persongroup FOREIGN KEY(groupid) REFERENCES groupspersonx(groupid) 

To powinno działać.

1

Zawsze, gdy chcesz utworzyć złożony klucz podstawowy lub unikalne ograniczenie w kolumnie, nie możesz podać odwołania w innej tabeli.

za przykład.

sql>create table t1(a number,b number,c number ,primary key(a,b,c)); 

table created. 

sql>create table g1(a number constraint con_fg references t1(a)); 

ERROR at line 1: 
ORA-02270: no matching unique or primary key for this column-list 

Tutaj t1 to tabela nadrzędna, a g1 to tabela podrzędna. Tablica podrzędna może zawierać zduplikowane wartości w jednej kolumnie. Tak więc oracle nie pozwoli na ten stół z kolumny.

Zobacz także

SQL>select constraint_name,constraint_type from user_constraints where table_name='T1'; 

CONSTRAINT_NAME    C 
------------------------------ - 
SYS_C005822     P 

Więc tutaj też jedynym ograniczeniem dla wszystkich trzech kolumn tj a, b, c w tabeli t1.

Dlatego nie można utworzyć Zagranicznych w sprawie złożonego klucza podstawowego lub kompozytowego unikalność

4
CREATE TABLE groupspersonx( 
    personid number, groupid number, 
CONSTRAINT pk_persongroupid PRIMARY KEY(personid, groupid)); 

CREATE TABLE restrictedgroups ( 
    pid number, 
    groupid number, 
    name varchar2(50), 
    dateadded date, 
    since date, 
    notes varchar2(1024), 
    CONSTRAINT pk_groupid PRIMARY KEY(groupid), 
    CONSTRAINT fk_persongroup FOREIGN KEY(pid,groupid) REFERENCES groupspersonx(personid, groupid)); 

* liczba referencji kolumn jest równa z obcych kolumn klucza