I’ve been assigned a task to delete data from a table with a subtree structure which means the foreign key can be contained in another rows in the same table. It’s a self contained foreign key on the same table.
Theoritically when it comes to my mind, i was thinking of recursive delete. But how????I’ve tried to google about it, I found this article from Microsoft. These are coming from Microsoft Article as well.
These are the dummy data that you can play around with in your DB
CREATE TABLE Employees
(empid int NOT NULL,
mgrid int NULL,
empname varchar(25) NOT NULL,
salary money NOT NULL,
CONSTRAINT PK_Employees_empid PRIMARY KEY(empid))
INSERT INTO employees(empid, mgrid, empname, salary)
VALUES( 1, NULL, 'Nancy', $10000.00)
INSERT INTO employees(empid, mgrid, empname, salary)
VALUES( 2, 1, 'Andrew', $5000.00)
INSERT INTO employees(empid, mgrid, empname, salary)
VALUES( 3, 1, 'Janet', $5000.00)
INSERT INTO employees(empid, mgrid, empname, salary)
VALUES( 4, 1, 'Margaret',$5000.00)
INSERT INTO employees(empid, mgrid, empname, salary)
VALUES( 5, 2, 'Steven', $2500.00)
INSERT INTO employees(empid, mgrid, empname, salary)
VALUES( 6, 2, 'Michael', $2500.00)
INSERT INTO employees(empid, mgrid, empname, salary)
VALUES( 7, 3, 'Robert', $2500.00)
INSERT INTO employees(empid, mgrid, empname, salary)
VALUES( 8, 3, 'Laura', $2500.00)
INSERT INTO employees(empid, mgrid, empname, salary)
VALUES( 9, 3, 'Ann', $2500.00)
INSERT INTO employees(empid, mgrid, empname, salary)
VALUES(10, 4, 'Ina', $2500.00)
INSERT INTO employees(empid, mgrid, empname, salary)
VALUES(11, 7, 'David', $2000.00)
INSERT INTO employees(empid, mgrid, empname, salary)
VALUES(12, 7, 'Ron', $2000.00)
INSERT INTO employees(empid, mgrid, empname, salary)
VALUES(13, 7, 'Dan', $2000.00)
INSERT INTO employees(empid, mgrid, empname, salary)
VALUES(14, 11, 'James', $1500.00)
I’m going to delete employee no 3(Janet) which means it need to delete 7(Robert),8(Laura),9(Ann) and 11(David),12(Ron),13(Dan), 14(James) based on the managerial structure level.
What you need to do is to create a trigger for cascading delete
CREATE TRIGGER trg_d_employees_on_delete_cascade ON Employees FOR DELETE
AS
IF EXISTS(SELECT *
FROM
Employees AS E
JOIN
deleted AS D ON E.mgrid = D.empid)
DELETE FROM Employees
FROM
Employees AS E
JOIN
deleted AS D ON E.mgrid = D.empid
GO
It will self join based on the deleted table. It’s not finish yet, you need to set the recursive trigger to active by executing command like
ALTER DATABASE DMO
SET RECURSIVE_TRIGGERS ON
Action Time:
DELETE FROM employees WHERE empid = 3
and you will see that it deletes all the subordinates of Janet