Oracle复合主键/外键问题

时间:2011-07-06 19:53:01

标签: sql oracle composite-key

我在oracle的1个表中有一个复合主键。我想为我的第二个表中的一个表项创建一个外键,该表引用第一个表中的复合主键。我收到错误ORA-02256。关于如何进入这个的任何想法?

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

4 个答案:

答案 0 :(得分:19)

错误是因为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来自的任何表添加外键约束。

答案 1 :(得分: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));

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

答案 2 :(得分:1)

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

代表

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。

这就是为什么你不能在复合主键或复合唯一约束

上创建外来的原因

答案 3 :(得分:0)

你不能使用:

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

也改变了:

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

这应该有效。