【问题标题】:How do I delete from a table that holds a Foreign Key, knowing the referenced table's Primary Key?如何在知道引用表的主键的情况下从包含外键的表中删除?
【发布时间】:2015-07-30 21:40:58
【问题描述】:

我在 Order:Stops 之间有一个 1:Many 的关系。

Order.OrderId 是主键。 Order.FileNumber 是我要删除 Stops by 的列。

Stop.OrderId 是外键,引用订单的主键。一个订单可以有多个止损点。 Stop.StopId 是 Stop 的主键。

首先删除订单,SQL 在外键约束上出现错误。首先删除止损,然后删除其对应的订单,不会导致任何错误。

如果我想删除我知道 Order.FileNumber 的 Stops,SQL 语句会是什么样子?

我假设是这样的:

DELETE FROM [dbo].[Stop] Stop LEFT JOIN [dbo].[Order] Ord
WHERE Ord.DriverNo = 123 AND Ord.FileNo = 456789 
AND Ord.OrderId = Stop.OrderId

GO

但没有任何效果。我们正在使用 SQL Server 2012。

【问题讨论】:

  • 在所有子记录都消失之前,您无法删除父表中的记录,除非您设置了级联删除。并且删除只能从单个表中删除记录。你不能做多表删除。
  • 我实际上是先删除孩子,而不是父母。

标签: sql sql-server sql-server-2008 sql-delete


【解决方案1】:

您可以尝试如下使用INNER JOIN

DELETE S 
FROM [dbo].[Stop] S 
INNER JOIN [dbo].[Order] Ord
ON Ord.OrderId = S.OrderId
WHERE Ord.DriverNo = 123 
AND Ord.FileNo = 456789 

您也可以使用ON DELETE CASCADE 将其作为级联删除,同时使用ALTER TABLE ... 语句定义外键(OR),这将确保删除父记录时,子表中的相关记录也会被删除(OR) 删除操作将被级联。

【讨论】:

  • 非常感谢 Rahul,这正是我所需要的!我正在学习如何将其作为级联删除。
猜你喜欢
  • 2018-12-11
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 2011-07-29
  • 1970-01-01
  • 2016-04-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多