2012-03-06 96 views
1

我有兩種不同的文件。一個是按文件夾組織的。另一個是由客戶組織的。下面是表的結構,在MySQL:如何在1到1表中的相應行被刪除時自動刪除表中的行?

Table docs 
ID 
title 

Table folderDocs 
docID -> docs(ID) 
folderID -> folders(ID) ON DELETE CASCADE 

Table clientDocs 
docID -> docs(ID) 
clientID -> clients(ID) ON DELETE CASCADE 

我正在尋找一個優雅的方式時,文件夾或客戶端被刪除自動刪除文件。以上級聯規則並不完全實現這一點。 (即folderDocs中的行將被刪除,但文檔中的相應行將保留。)

有沒有辦法在mysql中設置它,使用級聯規則或其他方法,以便當從folderDocs或clientDocs被級聯刪除,文檔中相應的行也被刪除? (我希望避免必須先編程刪除文件,然後刪除文件夾/客戶端。)

感謝(提前)尋求幫助。

+0

這可能是一個愚蠢的問題,但是你有'docID'設置爲表中的外鍵嗎?因爲你想要的東西聽起來像'ON DELETE CASCADE'所做的,但除非你設置了外鍵,否則它將不起作用。 – 2012-03-06 01:02:00

+0

爲什麼不使用DELETE觸發器? – Roger 2012-03-06 01:32:19

+0

@Rogier - 我認爲DELETE觸發器不起作用,如果刪除是級聯的。如果我誤解了這個,請糾正我。 – user1031947 2012-03-06 01:56:07

回答

0

假設每個文檔都必須屬於一個文件夾或客戶端,那麼你可能需要設定一個預定的清理作業刪除所有沒有文件夾和客戶端的文件使用下面的查詢

DELETE FROM docs USING docs 
LEFT JOIN clientDocs c ON (c.docid = docs.id) 
LEFT JOIN folderDocs f ON (f.docid = docs.id) 
WHERE ISNULL(c.clientid) AND ISNULL(f.folderid) 
+0

這將工作。但現在的問題是,每次查詢文檔時,都需要查詢文件夾和客戶端,看看它們是否仍然有效。 – iWantSimpleLife 2012-03-08 01:10:30

+0

您可以將此代碼添加到clientDocs和folderDocs表上的afterDelete觸發器,以便每次刪除文檔時都執行該代碼,或者每隔5分鐘從cron作業運行查詢 – 2012-03-08 06:02:41

0

我不認爲你可以在直接sql中做到這一點。你可能需要編寫一個存儲過程來完成它。

但這是一個好主意。因爲你的桌子設計的方式使它看起來像一個多對多的關係。你是否可以刪除一個文檔,如果仍然有來自另一個文件夾的引用?

如果他們被認爲是一對多關係,那麼文件夾和客戶端的外鍵應該在doc中,而不是表格本身。那麼你可以使用級聯刪除。

編輯:你可以嘗試使用觸發器。 http://dev.mysql.com/doc/refman/5.0/en/triggers.html

,但它仍然需要一些代碼被寫入(在觸發器的形式)

+0

謝謝,docs&folderDocs和docs&clientDocs之間的關係是1:1。 – user1031947 2012-03-06 01:20:47

+0

我編輯了答案。 – iWantSimpleLife 2012-03-08 01:08:20