2013-02-15 149 views
1

假設我的數據庫中有5個MyISAM表。每個表都有一個鍵,我們稱它爲「id_num」...在MyISAM中刪除之前,我應該檢查表中是否存在行嗎?

「id_num」是我用來將所有表連接在一起的字段。 「id_num」的某個值可能出現在所有表格中,或者有時只出現在表格的一個子集中。

如果我想刪除數據庫中某個「id_num」的所有實例,我可以對所有表執行DELETE命令,還是應該檢查「id_num」的值是否存在?

DELETE * FROM table1 WHERE id_num = 123; 
DELETE * FROM table2 WHERE id_num = 123; 
DELETE * FROM table3 WHERE id_num = 123; 
DELETE * FROM table4 WHERE id_num = 123; 
DELETE * FROM table5 WHERE id_num = 123; 

或者我應該先在每個表上執行一個SELECT命令來檢查這些行在刪除之前是否存在於表中?什麼是最佳做法?在其他有一個表id_num的PK,讓id_num一個FK -

(我在這裏使用的MyISAM所以級聯刪除是不是一種選擇。)

+0

使用forgein密鑰並級聯刪除 – sandeepKumar 2013-02-15 06:10:39

回答

0

要回答您關於首次運行SELECT的問題,這樣做沒有任何優勢。如果給定表中沒有行,那麼DELETE只會影響零行。如果有匹配的行,那麼首先執行SELECT,然後執行DELETE只會使查找行的工作增加一倍。所以,只需執行DELETE並將其結束。

您是否知道MySQL具有多表DELETE語法?

如果您確信表1有一個匹配行,你可以使用外部連接的其他:

DELETE table1.*, table2.*, table3.*, table4.*, table5.* 
FROM table1 
LEFT OUTER JOIN table2 USING (id_num) 
LEFT OUTER JOIN table3 USING (id_num) 
LEFT OUTER JOIN table4 USING (id_num) 
LEFT OUTER JOIN table5 USING (id_num) 
WHERE table1.idnum = 123; 

我假設ID_NUM在所有這些表建立索引,否則做JOIN將表現不佳。但是在沒有索引的幫助下做DELETE來查找行也會表現不佳。

+0

感謝您指出多表的DELETE語法。您預計並回答了我的下一個問題。 – iakkam 2013-02-15 21:36:15

1

聽起來像是你需要改變你的設計如下表與刪除級聯。這將允許您僅運行一條刪除語句來刪除所有適用的數據(並且這通常也是更正確的做法)。

上面顯然在MyISAM中不起作用,但有a workaround using triggers(但現在看起來確實不太吸引人)。

但我相信你的上述查詢應該可以工作,不需要檢查是否有某個東西先存在,DELETE將不會做任何事情。

如果您希望查看是否真的刪除了數據,則大多數API都會爲您提供某種rows affected計數。

+0

我不認爲你可以使用外鍵/ on-delete級聯與MyISAM引擎......我錯了嗎? – iakkam 2013-02-15 07:01:07

+0

@paxmercatoria我的不好,請參閱編輯。 – Dukeling 2013-02-15 07:03:23

0

在從表中刪除之前,不應該執行選擇查詢。由於select查詢會給服務器帶來一些額外的負載。但是,在執行刪除查詢之後,您可以使用php中的mysql_affected_rows()函數檢查已刪除了多少行。

相關問題