我有一个包含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
关系是一个人可以有多个地址,一个地址可以有多个人。 一个人可以有多个电话,一个电话可以有多个人。
我想删除使用他的名字连接到某个人的所有内容。当然地址/其他人使用的电话应保留在数据库中。
答案 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
您可以修改此更新以及删除电话。