【问题标题】:How do I create a trigger to mimic multiple ON DELETE CASCADE?如何创建触发器来模拟多个 ON DELETE CASCADE?
【发布时间】:2011-09-14 22:02:25
【问题描述】:

我有如下外键的表:

Table1A
|
|- Table2A3A

Table1B
|
|- Table2B
   |
   |- Table2A3A

(即Table2A3A引用Table1A,Table2B引用Table1B。)

我想创建一个触发器,以便每当表 Table1A、Table1B 或 Table2B 中的任何内容被删除时,Table2A3A 中引用已删除行的内容也会被删除。

我问是因为如果我尝试在 SQL Server 中添加 on delete cascade,它会返回 Introducing FOREIGN KEY constraint on table 'Table2A3A' may cause cycles or multiple cascade paths

这种触发器的 SQL 代码是什么?

编辑:

对不起,我看错了我的表格:

Table1A
|
|- Table2A3A
|
|- Table2B
   |
   |- Table2A3A

(即Table2A3A引用Table1A,Table2B引用Table1A。)

【问题讨论】:

  • 为什么要使用级联删除?这些都是坏消息......只需创建一个存储过程,从要删除的表中删除行。您将拥有更多控制权,可以实现错误处理等。

标签: sql-server-2008 triggers foreign-keys cascading-deletes


【解决方案1】:

在关系理论或 SQL 实践中,没有理由认为级联删除会导致循环或多个级联路径根据您的图表。也许您应该为每个表发布 DDL,这样我们就可以看到可能发生的其他情况。

这是我为 PostgreSQL 编写的测试。 (可能会为其他人节省一些时间。)我可以使用级联插入和删除。

create table Table1A (
  ta_id integer primary key
);

create table Table1B (
  tb_id integer primary key
);

create table Table2B (
  tb_id integer primary key references Table1B (tb_id) on delete cascade
);

create table Table2A3A (
  tb_id integer not null references Table2B (tb_id) on delete cascade,
  ta_id integer not null references Table1A (ta_id) on delete cascade,
  primary key (tb_id, ta_id)
);

【讨论】:

    猜你喜欢
    • 2014-09-26
    • 1970-01-01
    • 2011-09-21
    • 2018-12-02
    • 1970-01-01
    • 2015-11-07
    • 1970-01-01
    • 2016-09-28
    • 2015-01-27
    相关资源
    最近更新 更多