无法创建DB2引用约束

kx5bkwkv  于 2022-11-07  发布在  DB2
关注(0)|答案(1)|浏览(234)

我无法添加引用约束条件,两个表都有两列ID和版本作为主键。我将只检查行是否存在的完整性,而不检查版本。

CREATE TABLE TABLEE
(ID INTEGER NOT NULL,
VERSION INTEGER NOT NULL,
PRIMARY KEY (ID , VERSION);

CREATE TABLE CHAIR
(ID INTEGER NOT NULL,
VERSION INTEGER NOT NULL,
ID_TABLEE INTEGER,
PRIMARY KEY (ID , VERSION);

ALTER Chair
ADD constraint MYC FOREIGN KEY (ID)
REFERENCES TABLEE (ID)
ON DELETE RESTRICT

出现此错误

[Code: -573, SQL State: 42890]  A column list specified in the references clause of constraint "MYC " does not identify a unique constraint of the parent table or nickname "TABLEE".. SQLCODE=-573, SQLSTATE=42890, DRIVER=4.28.11

这里的问题是Tablee的主键由id和version两列组成,但是完整性检查应该只针对引用的id,而不是version。

mwg9r5ms

mwg9r5ms1#

要在表上建立外键,被引用列需要:
1.作为另一个表的主键。
1.......或者至少“扮演”一个角色。
由于被引用表上已经有了主键,因此可以使用第二种方法,在ID上添加UNIQUENOT NULL约束。
例如:

CREATE TABLE TABLEE (
  ID INTEGER NOT NULL,
  VERSION INTEGER NOT NULL,
  PRIMARY KEY (ID , VERSION),
  constraint uq1 unique (id) -- added UNIQUE constraint on ID
);

CREATE TABLE CHAIR (
  ID INTEGER NOT NULL,
  VERSION INTEGER NOT NULL,
  ID_TABLEE INTEGER,
  PRIMARY KEY (ID , VERSION)
);

ALTER table Chair
ADD constraint MYC FOREIGN KEY (ID) 
REFERENCES TABLEE (ID) 
ON DELETE RESTRICT;

请参阅db<>fiddle上的运行示例。

注意:如果您希望ID在整个表中具有重复的值,则ID不是键,并且不能作为键引用。

相关问题