我有這個代碼:
CREATE TABLE Employee (idEmployee int PRIMARY KEY, nane varchar(100));
CREATE TABLE Friend (idFriendA integer, idFriendB integer,
FOREIGN KEY (idFriendA) REFERENCES Employee (idEmployee) ON DELETE CASCADE,
FOREIGN KEY (idFriendB) REFERENCES Employee (idEmployee) ON DELETE CASCADE);
INSERT INTO Employee (idEmployee, nane) VALUES (0, 'Bob'),(1, 'Jean');
INSERT INTO Friend (idFriendA, idFriendB) VALUES (0, 1);
我希望如果我洗掉 Employee 中的 id 0,它將通過使用關系 Friend 級聯洗掉 Employee 中的 id 1。
我嘗試為 idFriendB 添加主鍵,但沒有成功
uj5u.com熱心網友回復:
另一種解決方案是觸發器,但如果我們嘗試在觸發器中更改表以洗掉同一個表,我們會得到表正在發生變化的所有錯誤。
另一種方法是洗掉 Friends 中的條目并使用觸發器洗掉 Employees 中的 2 行。
注意我不確定邏輯是什么。如果其中一名員工有另一個朋友會怎樣?我們會級聯更多的洗掉嗎?看看比爾在失去朋友鮑勃時失去了他的朋友瓊的案例。我們在哪里停下來?員工可以沒有朋友而存在嗎?
CREATE TABLE Employee ( idEmployee int PRIMARY KEY, nane varchar(100)); CREATE TABLE Friend ( idFriendA integer, idFriendB integer, FOREIGN KEY (idFriendA) REFERENCES Employee (idEmployee) ON DELETE CASCADE, FOREIGN KEY (idFriendB) REFERENCES Employee (idEmployee) ON DELETE CASCADE); INSERT INTO Employee (idEmployee, nane) VALUES (0, 'Bob'), (1, 'Jean'), (2,'Bill'); INSERT INTO Friend (idFriendA, idFriendB) VALUES (0, 1), (1, 2);
? ? ? ?
create trigger deleteFriend before delete on Friend for each row delete from Employee where idEmployee = old.idFriendA or idEmployee = old.idFriendB;?
select * from Friend; select * from Employee;idFriendA | idFriendB --------: | --------: 0 | 1 1 | 2 id員工 | 納內 ---------: | :--- 0 | 鮑勃 1 | 讓 2 | 賬單
delete from Friend where idFriendA = 0?
select * from Friend; select * from Employee;idFriendA | idFriendB --------: | --------: id員工 | 納內 ---------: | :--- 2 | 賬單
db<>在這里擺弄
uj5u.com熱心網友回復:
按照解釋,我想建議最好只使用一張桌子。我們使用遞回外鍵來確保父級存在。(我們對檔案系統 ID 1 的根目錄進行了例外處理,即/)
CREATE TABLE Files ( fileId integer PRIMARY KEY, name varchar(100) NOT NULL, parentId integer, FOREIGN KEY (parentId) REFERENCES Files (fileId) ON DELETE CASCADE, CONSTRAINT Parent_Not_Self CHECK (parentId <> fileId OR fileId = 1));?
INSERT INTO Files VALUES (1,'/',1);?
INSERT INTO Files VALUES (2,'/ twin',2);檢查約束“Parent_Not_Self”被違反。
INSERT INTO Files VALUES (3,'alone',4);無法添加或更新子行:外鍵約束失敗(`db_1032216260`.`Files`, CONSTRAINT `Files_ibfk_1` FOREIGN KEY (`parentId`) REFERENCES `Files` (`fileId`) ON DELETE CASCADE)
INSERT INTO Files VALUES (2,'/etc',1), (3,'/home',1), (4,'/mnt',1), (5,'/home/user_name',3);?
SELECT * FROM Files p JOIN Files c ON c.parentId = p.fileId;檔案ID | 姓名 | 父ID | 檔案ID | 姓名 | 父母身份 -----: | :---- | --------: | -----: | :---------------- | --------: 1 | / | 1 | 1 | / | 1 1 | / | 1 | 2 | /等| 1 1 | / | 1 | 3 | /主頁 | 1 1 | / | 1 | 4 | /mnt | 1 3 | /主頁 | 1 | 5 | /home/用戶名 | 3
db<>在這里擺弄
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/455702.html
下一篇:遍歷串列時閉包函式出錯
