6. Посмотрите, что derp, foo и bar теперь пусты:

я 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)

Может быть, что-нибудь попроще?

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 = ...

Триггер не нужен.

 Alexander Shlenchack25 янв. 2011 г., 22:31
спасибо, но я хочу использовать триггер
MySQL пошаговое руководство по созданию триггера для удаления двух таблиц с одним триггером:

1. Логин:

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. Посмотрите, что 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)
Решение Вопроса

Удалить из двух таблиц одновременно с помощью триггера:

Триггеры используются для обеспечения целостности данных в таблицах. Вы можете использовать триггеры для удаления из любого количества таблиц одновременно.

Перед инициализацией триггеров нам нужно временно изменить оператор разделителя 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 всякий раз, когда мы удаляем запись в таблице блога. Если триггер не работает, то удаление откатывается. Это помогает обеспечитьАтомность, последовательность, изоляция и долговечность в нашей базе данных.

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

user. Проверьте свое руководство.

 Randy25 янв. 2011 г., 22:31
для удаления может потребоваться NEW и не поддерживать OLD. - Я отредактирую ответ, чтобы отразить это.
 Mchl25 янв. 2011 г., 22:33
Я сомневаюсь:OLD.col_name refers to a column of an existing row before it is updated or deleted. NEW.col_name refers to the column of a new row to be inserted or an existing row after it is updated.
 Lalith B28 дек. 2012 г., 07:59
@Mchl спасибо 'работает только OLD.col_name, если нужно было удалить строку во время выполнения процедуры или триггера, который уже был удален'
 Mchl25 янв. 2011 г., 22:27
думаюNEW а такжеOLD псевдонимы доступны только вBEFORE триггеры
 Alexander Shlenchack25 янв. 2011 г., 22:17
1054 - Неизвестный столбец 'OLD.iduser' в 'предложении where'

Я забыл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
 Keith John Hutchison07 апр. 2013 г., 09:42
В триггере DELETE нет новой строки

Ваш ответ на вопрос