使用 ON DELETE CASCADE 选项

如果您希望当 DELETE 或 MERGE 语句删除父表中的行时,子表中相应的行也被删除,则使用 ON DELETE CASCADE 选项。

此处,parent table 是定义启用外键约束的 REFERENCING 子句指定的表 ,child table 是定义启用外键约束的表。如果您不指定级联删除,则在某个表被其它表用主键外键关系引用的情况下,数据库服务器的缺省行为防止 DELETE 和 MERGE 语句删除该表中的数据。

如果您指定此选项,则当删除父表中的行时,数据库服务器还删除任何与子表的该行(外键)关联的行。ON DELETE CASCADE 选项的运行您减少执行删除操作所需的 SQL 语句的数量。

例如:在 stores_demo 数据库中,stock 表将 stock_num 列包含为主键。catalog 表引用 stock_num 列作为外键。以下 ALTER TABLE 语句删除现有外键约束(没有级联删除),并添加指定级联删除的新约束:
ALTER TABLE catalog DROP CONSTRAINT aa;
        
        ALTER TABLE catalog ADD CONSTRAINT
        (FOREIGN KEY (stock_num, manu_code) REFERENCES stock
        ON DELETE CASCADE CONSTRAINT ab);

如果在子表上指定了级联删除,则除了从 stock 表中删除 stock 项以外,还删除级联到与 stock_num 外键相关联的目录表。此级联删除仅当 stock_num 没有订购时有效;否则,items 表中的约束将不允许级联删除。有关更多信息,请参阅 表有级联删除时对 DELETE 的限制

如果表带有 DELETE 触发事件的触发器,则您不能在该表上定义级联删除引用约束。当您试图将指定 ON DELETE CASCADE 的引用约束添加到有删除触发器的表时,接收到一条错误。

TRUNCATE 语句无法从子表进行级联删除。TRUNCATE 语句的目标表不能被在另一个定义启用外键约束表引用(除非子表没有行)。

有关从具有级联删除的表中删除行时的语法限制和锁定音响的信息,请参阅级联删除表时的注意事项