2011-07-06 249 views
11

我在oracle的1个表中有一个复合主键。我想为我的第二个表中的一个表项创建一个外键,它引用第一个表中的复合主键。我收到错误ORA-02256。任何想法,我怎么能进入这个?Oracle复合主键/外键问题

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

创建表groupspersonx( \t personid \t \t number, \t groupid \t \t \t number, \t CONSTRAINT pk_persongroupid PRIMARY KEY(personid,groupid) ); 创建表restrictedgroups( \t GROUPID \t \t \t号, \t名\t \t \t VARCHAR2(50), \t dateadded \t \t日期, \t因为\t \t \t日期, \t笔记\t \t \t VARCHAR2(1024) , \t CONSTRAINT pk_groupid PRIMARY KEY(groupid), CONSTRAINT fk_persongroup FOREIGN KEY(groupid)REFERENCES groupspersonx(personid,groupid) ); – Christopher

回答

18

错误是因为FOREIGN KEY是一列,但您试图提供两列作为父项。有没有必要绑在复合键,因为restrictedgroups没有一个personid列...

你也有倒退的关系 - 使用:

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

我想补充一个外键约束无论表personid将来自何处。

+0

我现在看到,非常感谢! – Christopher

0

不能使用:

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

变化太:

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

这应该工作。

1

无论何时您想在列上创建组合主键或唯一约束,都无法在另一个表中提供引用。

for ex。

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 

这里t1是父表,g1是子表。子表可以在一列中包含重复的值。所以oracle不会允许这个列表。

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

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

看到如此,这里还为所有三列的唯一约束即在T1表中A,B,C。

这就是为什么你不能创建复合主键或复合唯一约束外国

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

*引用的列数与外键列等于