2015-04-27 5 views
1

Я использую MySQL. У меня есть запись на столе A с столбцом с мягким удалением: active со значением 0.MySQL check before soft delete

Эта строка связана с 11 таблицами. Все они имеют одинаковый столбец active.

Я должен быть уверен, что запись на A удаляется производится только при все ссылки через эти 11 таблицы имеют active = 0 также.

Я знаю, что могу написать представление с этими запросами, чтобы получить, могу ли я «удалить» или нет. Но это один из примеров, и ИМО не очень практичное решение. Обновление Cascade не будет работать либо потому, что я не может удалить родительскую строку, если какой-либо из дочерних элементов по-прежнему активен.

Спасибо!

+0

Вы говорите: я должен быть уверен, что запись на 'A' ​​будет удалена **, только если ** все ссылки в 11 таблицах также имеют значение' active = 0'. Удалено, вы имеете в виду жесткое удаление или мягкое удаление (set active = 0) –

+0

Это может стать беспорядочным, возможно, считать fk ограничивать удаление, что означает, что вам всегда нужно удалять дочерние элементы перед родителем. – Augwa

+0

@SteveMandl Да. Скажите, что у вас есть Студент. Вы не можете удалить (Active = 0), если он все еще находится на курсе (активен = 1 в таблице Students_Courses). Мне нужно сохранить обе записи для журналов истории. – Jaxedin

ответ

1

Это должно работать, если вы создадите active_view, как вы сказали, что сможете. Просто добавьте активные флаги всех связанных таблиц в столбец foreign_active, и вам должно быть хорошо идти.

CREATE TRIGGER before_update_student 
BEFORE UPDATE ON student FOR EACH ROW 
BEGIN 
     IF NEW.active = 0 AND (SELECT foreign_active FROM active_view 
      WHERE id = NEW.id) > 0 
     THEN 
      SIGNAL SQLSTATE '45000' 
       SET MESSAGE_TEXT = 'Cannot delete student when active roles exist.'; 
     END IF; 
END; 
+0

Итак, если у меня 11 таблиц, я должен проверить их все, скажем так, вручную? Существует ли общий и более быстрый способ? – Jaxedin

+0

В нашей базе данных, вероятно, нет более элегантного способа. Если mysql поддерживает подзапросы в контрольных ограничениях, вы можете добавить контрольные ограничения для каждой связанной таблицы. Но я не думаю, что это лучше. Вы можете применить это в своем приложении, тогда может быть что-то умное, что вы могли бы сделать, используя подписку/уведомление или наследование объектов. –

+0

mmm У меня такое чувство, что делать это неправильно, но все поиски, которые я делал, закончились чем-то вроде этого. Я думаю, что чем скорее я начну писать, тем лучше. Благодаря! – Jaxedin