簡體   English   中英

當刪除1對1表中的相應行時,如何自動刪除表中的行?

[英]How to automatically delete rows in a table when the corresponding rows in a 1 to 1 table are deleted?

我有兩種不同的文件。 一種是按文件夾組織的。 另一個由客戶組織。 這是mysql中的表結構:

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中的行將被刪除,而docs中的相應行將保留。)

無論如何,是否可以使用級聯規則或其他方法在mysql中進行設置,以便當級聯刪除folderDocs或clientDocs中的一行時,也刪除了docs中的相應行? (我希望避免先以編程方式刪除文檔,然后再刪除文件夾/客戶端。)

在此先感謝您的幫助。

我不認為您可以在直接sql中做到這一點。 您可能需要編寫一個存儲過程來做到這一點。

但這是一個好主意。 由於表的設計方式使它看起來像多對多關系。 如果仍然有其他文件夾的文檔引用,您可以刪除該文檔嗎?

如果假定它們是一對多的關系,則文件夾和客戶端的外鍵應該在doc中,而不是在表中。 那么您可以使用級聯刪除。

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

但仍然需要編寫一些代碼(以觸發器的形式)

假設每個文檔必須屬於一個文件夾或一個客戶端,那么您可能想要設置一個計划的清理作業,以使用下面的查詢刪除所有沒有文件夾和客戶端的文檔

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM