【问题标题】:Delete rows from multiple joined tables从多个连接表中删除行
【发布时间】:2020-08-01 10:04:20
【问题描述】:

我在从 SQL Server 中的多个连接表中删除行时遇到问题。

这是我的脚本:

DELETE d, di, dis 
FROM Data d  
JOIN DataItem di ON di.DataId = d.DataId  
JOIN DataItemSend dis ON dis.DataItemId = di.DataItemId
WHERE d.CardId = 1555

但是这种语法不正确,第一行的逗号带有下划线。我该如何解决这个问题?

【问题讨论】:

  • 您不能从表中删除单个列 - 您会删除整行 - 这就是为什么它必须是 DELETE * FROM ...

标签: sql-server tsql join foreign-keys sql-delete


【解决方案1】:

SQL Server 不支持一次从多个表中删除 - 例如与 MySQL 不同。

但是,您的查询的构建方式使您看起来可以使用 on delete cascade 选项在表之间设置正确的外键,如下所示:

alter table DataItem 
    add constraint fk_DataItem_Data
    foreign key (DataId) references Data(DataId)
    on delete cascade
;

alter table DataItemSend 
    add constraint fk_DataItemSend_DataItem
    foreign key (DataItemId) references DataItem(DataItemId)
    on delete cascade
;

设置完成后,您可以从父表中删除:

delete from Data where CardId = 1555

...放心,children 表中的所有相关记录都会被删除。

【讨论】:

  • 作为一个多年来做过 Stupid Things℠ 的人,我回避delete cascade,而是编写一个存储过程来实现相应的功能。它还提供了进行其他验证的地方,如果您选择适当地保护基础表,则可以防止(大多数)用户直接删除数据。个人偏好>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-05
  • 2012-06-01
  • 2015-03-15
  • 1970-01-01
  • 1970-01-01
  • 2015-08-05
  • 1970-01-01
相关资源
最近更新 更多