0

我有一个包含 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

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

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

4

1 回答 1

0

使用外键,当您更新/删除 PARENT 表时,CASCADE 会影响 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

您可以修改它以进行更新和删除电话。

于 2013-09-19T22:10:51.990 回答