Я хочу, чтобы триггер DELETE из 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
Но он не будет компилироваться. Как сделать триггер, который удаляется из двух таблиц одновременно?
Ответы
Ответ 1
Удалить из двух таблиц сразу триггером:
Триггеры используются для обеспечения целостности данных в таблицах. Вы можете использовать триггеры для удаления из любого количества таблиц одновременно.
Перед инициализацией триггеров мы временно меняем оператор-ограничитель 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
всякий раз, когда мы удаляем запись в таблице блога. Я запускаю триггер, затем удаление отменяется. Это помогает обеспечить Атомность, Консистенция, Изоляция и Долговечность в нашей базе данных.
Ответ 2
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 может потребоваться OLD.iduser и не поддерживать NEW.iduser. Проверьте свое руководство.
Ответ 3
Что-то проще может быть?
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 = ...
Не требуется триггер.
Ответ 4
Я забыл блоки 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
Ответ 5
Прохождение MySQL по созданию триггера для удаления двух таблиц с одним триггером:
1. Логин:
[email protected]:~$ 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. Удалить из derp
mysql> delete from derp where derp1 = 1;
Query OK, 1 row affected (0.01 sec)
6. Смотрите, что derp, foo и bar пустые:
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)