2009-12-22 3 views
3

У меня есть таблица с именем пользователя. Эта таблица имеет внешний ключ для таблицы отделов. Один пользователь может быть связан с одним отделом. Перед удалением отдела я хотел бы установить для любого пользователя (имеющего этот идентификатор отдела) значение по умолчанию (1), чтобы избежать ошибки ссылочной целостности.Trigger before delete MySql

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

Спасибо.

+0

«спусковым крючком применяется к одной таблице» Средства таблица связана с конкретным актом на конкретной таблице, это не может быть связано (как и в то, что заставляет его для запуска) для нескольких таблиц. Он может преформировать любые действия, которые создатель триггера имеет права на заготовку. – MindStalker

+0

Этот SQL работал: CREATE TRIGGER dept_set_user_to_wuk ПРЕЖДЕ ЧЕМ УДАЛИТЬ de de ДЛЯ КАЖДОГО РУКА ОБНОВЛЕНИЕ user SET deptid = 1 WHERE deptid = OLD.deptid; где dept - отдел – rtacconi

ответ

9

Я не проверял, но based on the documentation, это выглядит правильно:

CREATE TRIGGER update_user_before_delete BEFORE DELETE ON department 
    FOR EACH ROW BEGIN 
    UPDATE user SET department = 1 WHERE department = OLD.department; 
    END; 
+0

Iget: ERROR 1064 (42000): У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с «UPDATE user SET user.deptID = 1 WHERE user.deptID = OLD.deptID» в строке 1 – rtacconi

+4

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

0

Вы можете использовать любой SQL в вашем коде триггера. Когда запись удаляется, запускается триггер-код. Вы можете использовать запись, в которой был запущен триггер (для выбора идентификатора отдела), а затем выберите любого пользователя с этим идентификатором и обновите эту запись пользователя. Удача

3

В большинстве случаев лучше установить дочернее значение NULL, когда родительский объект удален, вместо того, чтобы использовать значение по умолчанию 1, как вы это делаете.

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

Что-то вроде этого:

ALTER TABLE `user` 
ADD CONSTRAINT FK_USER_TO_DEPARTMENT FOREIGN KEY (department_id) 
REFERENCES `department` (department_id) ON DELETE SET NULL; 
+0

Это имеет смысл, но требование состоит в том, чтобы каждый пользователь должен был принадлежать отделу или, по крайней мере, в отделе 1, который является компанией. Да, это будет лучше и проще использовать SET NULL, но я не могу этого сделать. – rtacconi

+1

@rtacconi: вы можете использовать ** установить значение по умолчанию ** в соответствии с внешним ограничением –

+0

установить значение по умолчанию в принудительном принудительном принудительном ключе к определенному номеру, может разорвать резервную копию Mysql при восстановлении/импортировании ваших данных, даже если вы отключите проверку ограничений. Я звучу с ума, но это случилось со мной. – rtacconi