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 ;