【发布时间】:2020-09-17 13:29:03
【问题描述】:
我必须从两个表中的每一个中删除一行,它们由一个 ID 链接,但没有正确的 PK - FK 关系(这个数据库没有外键!)
这些表具有假定的 1-1 关系。我不知道为什么它们不只是放在同一张桌子上,但我无权更改它。
人
PersonId | Name | OwnsMonkey
----------------------------
1 Jim true
2 Jim false
3 Gaz true
信息
PersonId | FurtherInfo
-----------------------------
1 Hates his monkey
2 Wants a monkey
3 Loves his monkey
要决定删除什么,我必须找到用户名以及他们是否拥有猴子:
Select PersonId from People where Name = 'Jim' and OwnsMonkey = 'false'
所以我正在使用这个想法做两个单独的语句,首先从 Info 删除,然后从 People 删除
delete from Info where PersonId = (Select PersonId from People where Name = 'Jim' and OwnsMonkey = 'false');
delete from People where PersonId = (Select PersonId from People where Name = 'Jim' and OwnsMonkey = 'false');
我找到了一个有希望的答案here on StackOverflow
delete a.*, b.*
from People a
inner join Info b
where a.People = b.Info
and a.PersonId =
(Select PersonId from People where Name = 'Jim' and OwnsMonkey = 'false')
但它在 Sql Server (2012) 中给出了语法错误,我也尝试过不使用别名,但似乎无法同时删除两个表
【问题讨论】:
-
"这个数据库没有外键!" - 你有我的同情。
-
请发布从 SQL Server 返回的 full 语法错误消息。您最初的
DELETE FROM语句应该有效。您使用的是什么版本的 SSMS? -
另外,您的双
DELETE FROM语句应包含在TRY/CATCH和BEGIN TRANSACTION/COMMIT中(ROLLBACK在CATCH块中)。 -
一个 DML 语句一次只能影响一个对象。如果您需要影响多个表,您要么需要发出多个 DDL 语句(在本例中为
DELETE),要么在启用CASCADE的情况下实现主键和外键。 -
@jamheadart
TRY/CATCH是必要的,但还不够。您需要将它与BEGIN TRANSACTION+COMMIT结合起来(在CATCH块中使用ROLLBACK)。
标签: sql sql-server sql-server-2012