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

时间:2013-09-19 21:30:41

标签: 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

[Telephone]
-TelephoneId PK
-TelephoneNumber 
-Type

我所有的FK约束都在使用

ON DELETE CASCADE
ON UPDATE CASCADE

关系是一个人可以有多个地址,一个地址可以有多个人。 一个人可以有多个电话,一个电话可以有多个人。

我想删除使用他的名字连接到某个人的所有内容。当然地址/其他人使用的电话应保留在数据库中。

1 个答案:

答案 0 :(得分:0)

使用外键时,CASCADE会在您更新/删除PARENT表时影响CHILD表。

您从Person中删除:这是Resident和TelephoneOwner的父表。您删除的人的任何记录都将从这两个表中删除。它不会从Resident和TelephoneOwner级联到Telephone或Addresse。如果你想让这些桌子保持干净,你可以安排一份工作来定期清理这些桌面,或者在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

您可以修改此更新以及删除电话。