Как автоматически удалить строки в таблице при удалении соответствующих строк в таблице 1 к 1? - PullRequest
1 голос
/ 06 марта 2012

У меня есть два разных типа документов.Один организован по папке.Другой организован клиентом.Вот структура таблицы в 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, используя правила каскадирования или каким-либо другим способом, чтобы, когда строка изПапкаDocs или clientDocs удаляется каскадом, соответствующая строка в документе также удаляется?(Я надеюсь избежать необходимости программно удалять документы сначала, а затем удалять папку / клиента.)

Спасибо (заранее) за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 06 марта 2012

Предполагая, что каждый документ должен принадлежать папке или клиенту, вы можете настроить запланированное задание очистки, чтобы удалить все документы, у которых нет папок и клиентов, используя запрос ниже

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 голосов
/ 06 марта 2012

Я не думаю, что вы можете сделать это в прямой SQL.вам может понадобиться написать хранимую процедуру, чтобы сделать это.

Но это хорошая идея.потому что то, как устроены ваши столы, делает их похожими на отношения между многими.Можете ли вы удалить документ, если на него все еще есть ссылки из другой папки?

Если предполагается, что они связаны между собой, то внешний ключ к папке и клиенту должен быть в документе ине стол сам по себе.тогда вы можете использовать каскадное удаление.

Редактировать: вместо этого вы можете попробовать использовать триггер.http://dev.mysql.com/doc/refman/5.0/en/triggers.html

но все же требуется, чтобы были написаны некоторые коды (в форме триггеров)

...