2010-11-09 2 views
1

Скажем, у меня есть эти таблицы SQL:
а) книга
б) клиент
с) borrow_history (book_id, customer_id ...)Внешний ключ и отношение п-к-п

я могу определить две ссылки на внешние ключи (на удаления каскада) из borrow_history, ссылаясь книгу и клиента, так :

  • borrow_history запись, связанная с книги будет удалена, когда книга была удалена.
  • Записей записей, подключенных к , клиент будет удален при удалении клиента.

Но как я определить внешние ключи таким образом, что клиент будет удален, если он не имеет borrow_history не подключен к нему, так что удаление книги может рекурсивно удалить также клиент?

Возможно ли, или мне нужно использовать триггеры?

+1

Клиент может существовать, когда книга (и ее заимствования_история) возникает, но когда когда эта книга (и ее заимствования) перестает существовать, клиент также перестает существовать? Это звучит странно. – onedaywhen

+0

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

ответ

2

Для этого вам необходимо использовать триггеры.

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

Я бы написал сценарий (и запустил его с помощью CRON), чтобы удалить пользователей без каких-либо заимствований с более чем N дней от их последнего действия.

И еще один подсказку - внешний ключ в указательных книгах по заимствованиям должен быть установлен в ON DELETE RESTRICT. Если книга заимствована (или была заимствована), ее НЕ следует удалять.

+0

Спасибо, кстати, у меня нет книжного магазина :), это был просто простой пример отношения n-to-n, на самом деле мне действительно нужно удалить рекурсивно все данные, которые не связаны отношением больше. – kovarex

Смежные вопросы