多个“ ON DELETE CASCADE”约束用于相同的外键

时间:2018-12-30 09:39:56

标签: sql-server tsql cascade

场景

想象一下一个聊天服务器,其中包含对话C和每个对话中有多个帖子P。用户可以回复帖子。此数据应存储为reply := (original_post_id, replyer_post_id)

为模拟这一点,我有P表(帖子)和R表(回复):

CREATE TABLE P (
    id BIGINT NOT NULL,
    -- more data ...
)

CREATE TABLE R (
    orig_id BIGINT NOT NULL,
    repl_id BIGINT NOT NULL,

    FOREIGN KEY orig_id REFERENCES P(id),
    FOREIGN KEY repl_id REFERENCES P(id),
)


问题

如果我想在删除R时自动删除所有关联的P条目,请将R的定义的最后两行更改为:

    ...
    FOREIGN KEY orig_id REFERENCES P(id) ON DELETE CASCADE,
    FOREIGN KEY repl_id REFERENCES P(id) ON DELETE CASCADE,
)

但是,我收到以下错误:

  

在表[...]上引入FOREIGN KEY约束可能会导致循环或多个级联路径。指定ON DELETE NO ACTIONON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。


问题

为什么我确实会收到此错误?从技术上讲,这不是一个循环,因为R.orig_idR.repl_id都未被其他任何表引用(因此可能会创建一个循环)。 此外,我看不到为什么应该有多个级联路径,因为删除过程如下:

  • 使用PP.id = 1234删除条目
  • 使用R R.repl_id = 1234
  • R.orig_id = 1234中删除任何条目

我应该以某种方式约束R.repl_idR.orig_id列不相等吗?

0 个答案:

没有答案