想象一下一个聊天服务器,其中包含对话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 ACTION
或ON UPDATE NO ACTION
,或修改其他FOREIGN KEY
约束。
为什么我确实会收到此错误?从技术上讲,这不是一个循环,因为R.orig_id
和R.repl_id
都未被其他任何表引用(因此可能会创建一个循环)。
此外,我看不到为什么应该有多个级联路径,因为删除过程如下:
P
从P.id = 1234
删除条目R
或 R.repl_id = 1234
R.orig_id = 1234
中删除任何条目
我应该以某种方式约束R.repl_id
和R.orig_id
列不相等吗?