0

我有以下两个表格:

    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 约束,这样如果有人尝试删除 owner 表中的 Owner,如果该所有者是宠物的所有者,则删除操作将被拒绝。我知道我必须使用 ON_DELETE RESTRICT 命令,但我不知道该怎么做。

我试过这个:

ALTER TABLE OWNERS
ADD CONSTRAINT no_delete
FOREIGN KEY (P_ID)
REFERENCES PETS(P_ID)
ON DELETE RESTRICT

无济于事。

4

2 回答 2

4

你的语法是正确的。你的逻辑是错误的。

如果所有者在“宠物”表中有宠物,您希望防止删除该所有者。为此,您需要更改表“pets”,并添加引用表“owners”的外键约束。

于 2011-02-14T02:19:52.360 回答
3

Catcall 是正确的,这是正确的 ALTER TABLE 命令(在 DB2 LUW v9.7 中测试):

ALTER TABLE pets ADD CONSTRAINT no_delete FOREIGN KEY (P_ID) REFERENCES owner(P_ID) ON DELETE RESTRICT;

然后,当我尝试使用以下命令从所有者表中删除史蒂夫时:

DELETE FROM owner where O_ID = 'Steve';

正如预期的那样,我收到了:

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

然后为了确保这完全按预期工作,我删除了史蒂夫的狗:

从宠物中删除 O_ID = '史蒂夫'

并重新尝试从所有者表中删除史蒂夫,它成功了!

于 2011-02-15T21:15:00.190 回答