MySQL Trigger: удалить из таблицы ПОСЛЕ УДАЛЕНИЯ
Область: две таблицы. Когда создается новый патрон, у них есть некоторая информация о них, хранящаяся во 2-й таблице (это было сделано с использованием триггера, как и ожидалось). Вот пример моей структуры таблицы и отношения.
Таблица 1- > покровители
+-----+---------+-----+
+ id + name + val +
+=====+=========+=====+
+ 37 + george + x +
+-----+---------+-----+
+ 38 + sally + y +
+-----+---------+-----+
Таблица 2 → patron_info
+----+-----+----------+
+ id + pid + name +
+----+-----+----------+
+ 1 + 37 + george +
+----+-----+----------+
+ 2 + 38 + sally +
+----+-----+----------+
Администратор может управлять покровителями. Когда они выбирают удалить патрона, патрон удаляется из таблицы 1 patrons
. На данный момент ничего не происходит с таблицей 2 patron_info
.
Я просто пытаюсь создать триггер для удаления из таблицы 2, когда в таблице 1 удален элемент. Вот что я пробовал...
Вначале я пытаюсь сбросить триггер, если он существует (просто очистить воздух)...
DROP TRIGGER IF EXISTS log_patron_delete;
Затем я пытаюсь создать триггер потом...
CREATE TRIGGER log_patron_delete AFTER DELETE on patrons
FOR EACH ROW
BEGIN
DELETE FROM patron_info
WHERE patron_info.pid = patrons.id
END
В этот момент я получаю синтаксическую ошибку 1046: Check syntax near END on line 6
. Я не знаю, какова ошибка на этом этапе. Я пробовал несколько разных вариантов. Кроме того, я должен использовать разделитель здесь?
Может ли кто-нибудь помочь восстановить мое здравомыслие?
Ответы
Ответ 1
Я думаю, что есть ошибка в коде триггера. Поскольку вы хотите удалить все строки с идентификатором удаленного посетителя, вы должны использовать old.id (в противном случае это приведет к удалению других идентификаторов)
Попробуйте это как новый триггер:
CREATE TRIGGER log_patron_delete AFTER DELETE on patrons
FOR EACH ROW
BEGIN
DELETE FROM patron_info
WHERE patron_info.pid = old.id;
END
Не забывайте ";" на запрос на удаление. Также, если вы вводите код TRIGGER в окне консоли, также используйте разделители.
Ответ 2
Почему бы не установить ON CASCADE DELETE на внешний ключ patron_info
.pid?
Ответ 3
create trigger doct_trigger
after delete on doctor
for each row
delete from patient where patient.PrimaryDoctor_SSN=doctor.SSN ;