我在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)
);
答案 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)
这应该有效。