我正在制作一個資料庫,我需要將列SuperDni轉換成參考列Dni的外鍵。我想以級聯方式洗掉,但是如果我把CASCADE放在NO ACTION的位置,我得到一個錯誤:
回圈或多級聯動路徑
只有這樣做,我才能創建表,但是如果我洗掉了一個參考該鍵的鍵,我需要洗掉級聯中的暫存器。
例如,如果我洗掉了Dni = 1,我需要洗掉列SuperDni中包含該Dni值的暫存器。
有什么方法可以做到這一點嗎?因為我正在學習使用MySQL和SQL Server,我可以在MySQL中做到這一點。
CREATE TABLE Empleado
(
Nombre VARCHAR(20) NOT NULL,
Apellido1 VARCHAR(20) 非 NULL。
Apellido2 VARCHAR(20)。
Dni VARCHAR(20) PRIMARY KEY NOT NULL,
Sexo VARCHAR(1)。
Sueldo INT,
SuperDni VARCHAR(20)。
Dno INT,
FOREIGN KEY(SuperDni)
REFERENCES Empleado(Dni)
ON DELETE NO動作
ON UPDATE NO ACTION
);
INSERT INTO Empleado VALUES( "a", "a", "a", "1", "a", 200, NULL, NULL)。)
INSERT INTO Empleado VALUES( "b", "b", "b", "2", "b", 140, "1", NULL)。)
INSERT INTO Empleado VALUES( "c", "c", "c", "3", "c", 230, "1", NULL)。)
INSERT INTO Empleado VALUES( "d", "d", "d", "4", "d", 110, NULL, NULL)。)
我需要用這種形式來做,因為我在大學里學習。
uj5u.com熱心網友回復:
我假設你保持你的 FOREIGN KEY 約束,你不能在 FOR DELETE 觸發器中解決這個問題。FOR 觸發器(也被稱為 AFTER 觸發器)在活動發生后才啟動。而外鍵如果有參考的話,會阻止一行被洗掉。外鍵檢查發生在洗掉之前。
因此,你需要一個 INSTEAD OF 觸發器。
CREATE TRIGGER [dbo]. [SuperDni_Trigger]
ON [dbo].[Empleado].
INSTEAD OF DELETE
as as
WITH q AS
(
SELECT Dni
FROM Empleado
UNION ALL All
SELECT tc.Dni
FROM q
JOIN Empleado tc
ON tc.SuperDni = q.Dni
)
DELETE[/span
FROM Empleado
WHEREEXISTS
(
SELECT Dni
INTERSECT Dni
SELECT Dni
FROM q
)
SELECT * FROM Empleado
如果你想保存被洗掉的記錄,可以引入一個表變數來保存被洗掉的記錄串列。
CREATE OR ALTER TRIGGER [dbo]. [SuperDni_Trigger]
ON [dbo].[Empleado]。
INSTEAD OF DELETE
AS
DECLARE @deletions table (Dni varchar(7) not null)。)
;WITH q AS
(
SELECT Dni
FROM Empleado
UNION ALL All
SELECT tc.Dni
FROM q
JOIN Empleado tc
ON tc.SuperDni = q.Dni
)
--引入一個表變數來保存洗掉記錄。
insert into @deletions(Dni)。
select Dni from q
SELECT * FROM @deletions--從表的變數查詢資料。
--這個洗掉是最后的。
DELETE。
FROM Empleado
WHERE EXISTS
(
SELECT Dni
INTERSECT Dni
SELECT Dni
FROM q
)
SELECT * FROM Empleado
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/311049.html
標籤:
