2014-12-08 2 views
0

У меня есть простая база данных следующим образом. Он отображает сотрудников, в какой отдел (ы) они входят. Когда сотрудник уходит, их записи необходимо удалить из таблицы Employee и таблицы EmployeeDepartment. Аналогично, отделы также могут измениться. Когда отдел изменится, запись необходимо будет удалить из таблиц Department и EmployeeDepartment.Проблемы с MySQL при удалении из нескольких таблиц

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

DELETE e, ed FROM Employee e 
INNER JOIN EmployeeDepartment ed ON e.id = ed.id 
WHERE ed.id = ? 

? является идентификатор записи Я хочу удалить.

Редактировать

Для дальнейшего объяснения, удаления не будет работать, если идентификатор не в обоих Employee и Department. Поэтому, если сотрудник был создан, но еще не назначен отделу, удаление не будет работать.

+1

Вы должны смотреть на внешние ключи, в частности, каскадное удаление. –

+0

У меня нет возможности сделать более предварительную базу данных прямо сейчас ... как бы вы предложили сделать это с помощью соединений? – roundtheworld

+0

У вас есть столбцы «e» и «ed» в той же таблице Employee? –

ответ

0

Это должно делать то, что вы хотите:

DELETE e, ed FROM Employee e 
LEFT JOIN EmployeeDepartment ed ON e.id = ed.id 
WHERE e.id = ? 

Обратите внимание, что вы должны совпадать с Employee, так как вы говорите, EmployeeDepartment не гарантировано иметь записи.

Однако я вижу нулевую причину, чтобы сделать это как один запрос. Это добавляет сложности без реальной выгоды. Используйте два запроса и заверните их в транзакцию, чтобы сделать их атомарными. Начните транзакцию, удалите с Employee, затем удалите с EmployeeDepartment, затем совершите транзакцию.

0

У вас есть столбцы «e» и «ed» в той же таблице Employee? Если нет, то попробуйте следующее:

DELETE e.*, ed.* FROM Employee e 
LEFT JOIN EmployeeDepartment ed ON e.id = ed.id 
WHERE e.id = ? 

Если это не помогает, то определить внешних ключ ограничений на столах с ON DELETE CASCADE опции.

Затем удаление записи из родительской таблицы удаляет записи из дочерних таблиц.

Проверить эту ссылку: http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html

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