我想從8個表中刪除特定的行。 我的問題是行與外鍵連接。 如何刪除連接到要刪除的特定行的所有數據? 我的表格包括定義表(如id,名稱,最大值,最小值...), 數據表(如id,user_id,definition_id,....)和歷史表(保存數據表中的每一項更改)。如何刪除表中的行sql
我以爲使用級聯命令刪除,但我找不到使用它的方法。
我想從8個表中刪除特定的行。 我的問題是行與外鍵連接。 如何刪除連接到要刪除的特定行的所有數據? 我的表格包括定義表(如id,名稱,最大值,最小值...), 數據表(如id,user_id,definition_id,....)和歷史表(保存數據表中的每一項更改)。如何刪除表中的行sql
我以爲使用級聯命令刪除,但我找不到使用它的方法。
DELETE CASCADE
是外鍵約束的屬性。不幸的是,它不是可以用作DELETE
聲明的選項(實際上它確實很酷)
如果您的外鍵沒有被聲明爲級聯,則需要「按照自己的方式工作」。
可惜你沒告訴我們你的真實的表結構讓我們假設是這樣的:
main_table (main_id) child_one (id, main_id) child_two (id, id_one) child_three (id, id_two)
(我知道你說8個表,但爲示範的緣故,我縮短了一點,但不改變底層的「戰略」)
假設你想從'MAIN_TABLE刪除與main_id = 42
行:
首先,您需要使用像這樣從child_three刪除行:
delete from child_three
where id_two in (select id
from child_two
where id_one in (select id
from child_one
where main_id = 42);
然後從child_two刪除行:
delete from child_two
where id_one in (select id
from child_one
where main_id = 42);
然後child_one:
delete from child_one
where main_id = 42;
最後主表:
delete from main_table
where id = 42;
一些SQL客戶實際上可以產生這些陳述適合你。我不知道SQL Developer是否可以。
我假設你使用InnoDB引擎,因爲你所談論的外鍵,
更容易將是正確定義的表,這樣的刪除將作爲級聯刪除行爲。
CONSTRAINT `myForeignKey` FOREIGN KEY (`typeId`)
REFERENCES `types` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
這裏是ALINK用適當的創建表的語句:
你用什麼SQL:MySQL和MSSQL等..? – Michael 2012-07-29 12:12:50
您可以使用8個刪除語句(每個表對應一個)按照正確的順序執行,以便不違反FK約束。 – 2012-07-29 12:12:55
@Michael我使用MySql – Ofer 2012-07-29 12:14:43