透過外鍵約束的 ON DELETE CASCADE 與 ON UPDATE CASCADE,可在父表刪除/更新主鍵時,自動級聯操作子表關聯行,保證引用完整性並簡化應用代碼。
-- 父表:國家
CREATE TABLE Countries (
CountryId INT PRIMARY KEY
);
INSERT INTO Countries VALUES (1),(2),(3);
-- 子表:城市 (級聯刪除/更新國家)
CREATE TABLE Cities (
CityId INT PRIMARY KEY,
CountryId INT NOT NULL REFERENCES Countries(CountryId)
ON DELETE CASCADE ON UPDATE CASCADE
);
INSERT INTO Cities VALUES (1,1),(2,1),(3,2);
-- 孫表:買家 (級聯刪除/更新城市)
CREATE TABLE Buyers (
CustomerId INT PRIMARY KEY,
CityId INT NOT NULL REFERENCES Cities(CityId)
ON DELETE CASCADE ON UPDATE CASCADE
);
INSERT INTO Buyers VALUES (1,1),(2,1),(3,2);
DELETE FROM Countries WHERE CountryId = 1;
-- 結果:Countries 剩 (2,3);Cities 剩 (3,2);Buyers 剩 (3,2)
UPDATE Countries SET CountryId = 20 WHERE CountryId = 2;
-- 結果:Countries (1,20,3);Cities (1,1),(2,1),(3,20);Buyers 無變
| 動作 | 子句 | 行為 |
|---|---|---|
| 刪除父行 | ON DELETE CASCADE | 子表關聯行同步刪除 |
| 刪除父行 | ON DELETE SET NULL | 子表外鍵列置 NULL (列必須允許 NULL) |
| 刪除父行 | ON DELETE SET DEFAULT | 子表外鍵列置默認值 (列必須有 DEFAULT) |
| 刪除父行 | ON DELETE NO ACTION | 預設:阻止刪除,拋錯 (等同無級聯) |
| 更新父鍵 | ON UPDATE CASCADE | 子表外鍵值同步更新 |
| 更新父鍵 | ON UPDATE SET NULL/DEFAULT/NO ACTION | 同刪除語義 |
AFTER DELETE/UPDATE 觸發器,順序:父表 → 子表 → 孫表...MERGE 語句對目標表的刪除/更新不觸發 級聯動作(SQL Server 行為)。SELECT
fk.name AS FK_Name,
OBJECT_NAME(fk.parent_object_id) AS ChildTable,
COL_NAME(fkc.parent_object_id, fkc.parent_column_id) AS ChildCol,
OBJECT_NAME(fk.referenced_object_id) AS ParentTable,
COL_NAME(fkc.referenced_object_id, fkc.referenced_column_id) AS ParentCol,
fk.delete_referential_action_desc AS OnDelete,
fk.update_referential_action_desc AS OnUpdate
FROM sys.foreign_keys fk
INNER JOIN sys.foreign_key_columns fkc ON fk.object_id = fkc.constraint_object_id;
ALTER TABLE Child NOCHECK CONSTRAINT FK_Name,完畢後 CHECK CONSTRAINT。