2011-02-14 75 views
0

我有以下两个表:上的删除限制SQL帮助

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 

无济于事。

回答

4

您的语法无误。你的逻辑错了。

您想防止删除拥有宠物的宠物。要做到这一点,你需要改变表“宠物”,并添加一个引用表“所有者”的外键约束。

+0

我已经有这样的约束 - 至少我很确定我是这样做的。 – Waffles 2011-02-14 03:03:53

3

嘘声是正确的,这里是正确的ALTER TABLE命令(在DB2 LUW V9.7测试):

ALTER TABLE宠物添加约束 NO_DELETE外键(P_ID) 参考所有者(P_ID)ON DELETE RESTRICT;

然后,当我试图从所有者表具有以下命令删除史蒂夫:

DELETE FROM所有者其中O_ID = '史蒂夫';

我收到的,符合市场预期:

DB21034E该命令被处理为 的SQL语句,因为它不是一个 有效的命令行处理器命令。 在SQL处理期间,它返回: SQL0532N由于关系 “DB2INST1.PETS.NO_DELETE”限制 的删除,所以删除的父行不能为 。 SQLSTATE = 23001

然后,以确保这是预期的完全工作,我抹去史蒂夫的狗:

DELETE FROM宠物WHERE O_ID = '史蒂夫'

并重新运行试图从主人桌上删除史蒂夫,它的工作!