Я хочу триггер для удаления из 2 таблиц в MySQL
у меня есть 3 таблицы MySQL (food, apple и orange).
Я хочу, чтобы удалить строки:
apple(idapple, iduser, name) 
orange(idornge, iduser, name)
при удалении строки food(iduser, name) С помощью одного триггера?
вот мой триггер до сих пор:
  CREATE TRIGGER `food_before_delete`
    AFTER DELETE ON `food` 
    FOR EACH ROW 
      DELETE FROM apple, orange 
      WHERE 
      apple.iduser=OLD.iduser and 
      orange.iduser=OLD.iduser
но он не будет компилироваться. Как сделать триггер, который удаляет сразу из двух таблиц?
5 ответов
удалить из двух таблиц сразу с помощью триггера:
триггеры применяются для обеспечения целостности данных в таблицах. Вы можете использовать триггеры для удаления из любого количества таблиц одновременно.
перед инициализацией триггеров нам нужно временно изменить оператор разделителя mysql, потому что триггеры используют точку с запятой ; оператор для указания нескольких команд sql в триггере.
Шаг 1 изменение тока разделитель:
delimiter $$
Шаг 2 Создаем триггер:
CREATE TRIGGER `blog_before_delete`     
  AFTER DELETE ON `blog`     
  FOR EACH ROW     
BEGIN
  DELETE FROM blog_tags where blogid = OLD.id;
  DELETE FROM blog_comments where blogid = OLD.id;
END
$$
Шаг 3 Восстановление предыдущего разделителя:
delimiter ;
объяснение:
OLD является встроенным ключевым словом и ссылается на строку таблицы блога, которую мы удаляем. Mysql запускает триггер blog_before_delete всякий раз, когда мы удаляем запись в таблице блог. I триггер не срабатывает, затем удаление откатывается.  Это помогает обеспечить атомарность, Последовательность, изоляция, и стойкость в нашей базе.
CREATE TRIGGER `food_before_delete`     
AFTER DELETE ON `food`     
FOR EACH ROW     
begin
  DELETE FROM apple
  WHERE apple.iduser=NEW.iduser;
  DELETE FROM orange
  WHERE orange.iduser=NEW.iduser;
end
операторы delete могут требовать старого.iduser и не поддерживает новые.iduser. Проверь свое руководство.
может быть, что-то попроще?
DELETE f,a,o FROM
food AS f 
LEFT JOIN apple AS a USING (iduser)
LEFT JOIN orange AS o USING (iduser)
WHERE f.name = ...
триггер не требуется.
забыл BEGIN и END блоки в триггере.  И вы должны удалить из таблиц последовательно, как это:
CREATE TRIGGER `food_before_delete`     
  AFTER DELETE ON `food`     
  FOR EACH ROW     
BEGIN
  DELETE FROM apple
  WHERE apple.iduser=NEW.iduser;
  DELETE FROM orange
  WHERE orange.iduser=NEW.iduser; 
END
MySQL пошаговое руководство по созданию триггера для удаления двух таблиц с одним триггером:
1. Логин:
el@apollo:~$ mysql -u root -p
Enter password: 
mysql> use your_database;
Database changed
2. Создайте несколько тестовых таблиц и вставьте строки:
mysql> create table derp(derp1 INT);
Query OK, 0 rows affected (0.02 sec)
mysql> create table foo(foo1 INT);
Query OK, 0 rows affected (0.02 sec)
mysql> create table bar(bar1 INT);
Query OK, 0 rows affected (0.02 sec)
mysql> insert into derp values (1);
Query OK, 1 row affected (0.01 sec)
mysql> insert into foo values (1);
Query OK, 1 row affected (0.00 sec)
mysql> insert into bar values (1);
Query OK, 1 row affected (0.00 sec)
3. Сделайте триггер:
mysql> delimiter //
mysql> create trigger delete_foo_and_bar_when_derp_is_deleted
    -> after delete on derp
    -> for each row
    -> begin
    -> delete from foo where foo1=OLD.derp1;
    -> delete from bar where bar1=OLD.derp1;
    -> end//
Query OK, 0 rows affected (0.02 sec)
4. См. таблицы существуют, и все три заполнены.
mysql> delimiter ;
mysql> select * from derp;
+-------+
| derp1 |
+-------+
|     1 |
+-------+
1 row in set (0.00 sec)
mysql> select * from foo;
+------+
| foo1 |
+------+
|    1 |
+------+
1 row in set (0.00 sec)
mysql> select * from bar;
+------+
| bar1 |
+------+
|    1 |
+------+
1 row in set (0.00 sec)
5. Удалить из баттхерт
mysql> delete from derp where derp1 = 1;
Query OK, 1 row affected (0.01 sec)
6. Видеть этот дерп, фу и бар теперь пусты:--10-->
mysql> select * from derp;
Empty set (0.00 sec)
mysql> select * from foo;
Empty set (0.00 sec)
mysql> select * from bar;
Empty set (0.00 sec)
