Как указывает @Catcall, ссылочное действие ON DELETE SET NULL
делает то, что вам нужно.
Тем не менее, вы можете написать триггер INSTEAD OF
, чтобы сделать то же самое (или варианттема) без необходимости заботиться обо всех ограничениях ссылочной целостности самостоятельно.Вот краткий пример:
Таблицы и тестовые данные:
CREATE TABLE T1 (ID INTEGER NOT NULL UNIQUE);
CREATE TABLE T2 (ID INTEGER REFERENCES T1 (ID));
INSERT INTO T1 VALUES (1), (2), (3);
INSERT INTO T2 VALUES (1), (2), (3), (2), (3), (3);
Триггер:
-- 'CREATE TRIGGER' must be the first statement in a batch.
CREATE TRIGGER tr__T1__instead_of_delete
ON T1
INSTEAD OF DELETE
AS
BEGIN;
UPDATE T2
SET ID = NULL
WHERE EXISTS (
SELECT *
FROM deleted
WHERE deleted.ID = T2.ID
);
DELETE
FROM T1
WHERE EXISTS (
SELECT *
FROM deleted
WHERE deleted.ID = T1.ID
);
END;
Проверка триггера:
DELETE
FROM T1
WHERE ID = 3;