我有以下两个表格:
Owner:
O_ID P_ID
Bob Sam
Steve Rex
Pets
P_ID O_ID
Sam Bob
Rex Steve
第二列所有者(P_ID)是第一列宠物的外键(P_ID)。
在DB2中,我正在尝试添加ON_DELETE RESTRICT约束,这样如果有人要在所有者表中尝试删除所有者,如果该所有者是宠物的所有者,则删除操作将被拒绝。我知道我必须使用ON_DELETE RESTRICT命令,但我不知道该怎么做。
我试过这个:
ALTER TABLE OWNERS
ADD CONSTRAINT no_delete
FOREIGN KEY (P_ID)
REFERENCES PETS(P_ID)
ON DELETE RESTRICT
无济于事。
答案 0 :(得分:4)
您的语法是正确的。你的逻辑错了。
如果“宠物”表中有宠物,您希望阻止删除所有者。为此,您需要更改表“pets”,并添加引用表“owner”的外键约束。
答案 1 :(得分:3)
Catcall是正确的,这是正确的ALTER TABLE命令(在DB2 LUW v9.7中测试):
ALTER TABLE宠物ADD CONSTRAINT no_delete FOREIGN KEY(P_ID) REFERENCES所有者(P_ID)ON DELETE RESTRICT;
然后当我尝试使用以下命令从所有者表中删除Steve时:
从O_ID =的所有者处删除 '史蒂夫';
我按预期收到了:
DB21034E该命令被处理为 一个SQL语句,因为它不是一个 有效的命令行处理器命令。 在SQL处理期间,它返回: SQL0532N父行不能 删除因为关系 “DB2INST1.PETS.NO_DELETE”限制 删除。 SQLSTATE = 23001
然后为了确保这完全符合预期,我擦掉了史蒂夫的狗:
DELETE FROM pets WHERE O_ID ='Steve'
并重新尝试将史蒂夫从所有者表中移除,并且它有效!