2012-07-29 81 views
3

我想從8個表中刪除特定的行。 我的問題是行與外鍵連接。 如何刪除連接到要刪除的特定行的所有數據? 我的表格包括定義表(如id,名稱,最大值,最小值...), 數據表(如id,user_id,definition_id,....)和歷史表(保存數據表中的每一項更改)。如何刪除表中的行sql

我以爲使用級聯命令刪除,但我找不到使用它的方法。

+0

你用什麼SQL:MySQL和MSSQL等..? – Michael 2012-07-29 12:12:50

+1

您可以使用8個刪除語句(每個表對應一個)按照正確的順序執行,以便不違反FK約束。 – 2012-07-29 12:12:55

+0

@Michael我使用MySql – Ofer 2012-07-29 12:14:43

回答

4

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是否可以。

0

我假設你使用InnoDB引擎,因爲你所談論的外鍵,

更容易將是正確定義的表,這樣的刪除將作爲級聯刪除行爲。

 CONSTRAINT `myForeignKey` FOREIGN KEY (`typeId`) 
     REFERENCES `types` (`id`) ON DELETE CASCADE ON UPDATE CASCADE 

這裏是ALINK用適當的創建表的語句:

How do I use on delete cascade in mysql?