Sql 从表中删除记录(2x多对多关系)

Sql 从表中删除记录(2x多对多关系),sql,tsql,Sql,Tsql,我有一个包含5个表的数据库 [Person] -PersonId PK -First name -Middle name -Surname -Type [Resident] -PersonId PK FK -AddressId PK FK [Addresse] -AddressId PK -Road -Number -Postal code -City -Type [TelephoneOwner] -TelephoneId PK FK -PersonId PK FK [Telepho

我有一个包含5个表的数据库

[Person]
-PersonId PK
-First name
-Middle name
-Surname
-Type

[Resident]
-PersonId  PK FK
-AddressId PK FK


[Addresse]
-AddressId PK
-Road
-Number
-Postal code
-City
-Type

[TelephoneOwner]
-TelephoneId PK FK
-PersonId PK FK

[Telephone]
-TelephoneId PK
-TelephoneNumber 
-Type
我的所有FK约束都在使用

ON DELETE CASCADE
ON UPDATE CASCADE
这种关系是一个人可以有多个地址,而一个地址可以有多个人。 一个人可以有多部电话,一部电话可以有多个人


我想删除与使用名字的人有关的所有内容。当然,其他人使用的地址/电话应该保留在数据库中。

使用外键,在更新/删除父表时,级联会影响子表

您可以从Person:中删除,Person:是Resident和TelephoneOwner的父表。您删除的人的任何记录都将从这两个表中删除。它不会从居民和电话所有者级联到电话或地址。如果您想保持这些表的干净,您可以安排一个定期清理这些表的作业,或者在Person上添加一个触发器,以检查它是否将电话号码或地址留给了没有所有者的人。在这种情况下,请删除电话号码或地址

对于每个请求,下面包含一个示例触发器。请注意,如果您的系统不断删除和更新,触发器可能会导致性能问题

    CREATE TRIGGER [dbo].[some_trigger_name]
        ON [dbo].[Person]
      FOR DELETE
    AS
    BEGIN
      SET NOCOUNT ON
    DELETE 
    FROM Addresse
    WHERE AddressId IN(-- Select the Addresses associated with people who were just deleted.
    SELECT R1.AddressId FROM DELETED JOIN Resident R1 on DELETED.PersonId  = R1.PersonId 
    EXCEPT
    -- Substract Addresses that have a Person associated with them other then a Person who was just deleted.
    SELECT R2.AddressId FROM Resident R2 
    WHERE R2.PersonId  NOT IN(SELECT PersonId  from DELETED))
    END
    GO

您可以修改此项以进行更新,也可以删除电话。

删除与使用其名字的人连接的所有内容
可能有多个同名的人。感谢您的回答,我不熟悉触发器,并且在花时间在网上查找添加触发器的方法后。你可以写一个建议吗?@MortenGodrimJensen看一看,因为你把这个问题标记为tsql,我想你正在运行SQL Server。我会用一个触发器更新我的答案,你可以用它作为起点。