2012-06-28 2 views
1

Я думаю, что я прочитал, что триггер удаления не знает, какие данные были удалены, и петли по всей таблице с помощью триггера. Это правда?mysql delete triggers

Означает ли это, что перед циклом удаления по всей таблице перед удалением данных и после циклов удаления по всей таблице после удаления происходит?

Невозможно ли перебрать только удаленные записи? Итак, если 10 записей удаляются по ним?

DELIMITER $$ 
DROP TRIGGER `before_delete_jecki_triggername`$$ 
CREATE TRIGGER before_delete_triggername 
BEFORE DELETE ON table 
FOR EACH ROW 
BEGIN 
    /*do stuff*/ 
END$$ 
DELIMITER ; 

Спасибо,

Mat

+0

Где вы это читали? AFAIK, '{ПЕРЕД | AFTER} DELETE' запускается только в записях, которые должны быть/были удалены соответственно. Вы можете использовать псевдоним таблицы OLD для доступа к данным в соответствующей записи. – eggyal

+0

Кто-то еще на SO - Я пытаюсь найти нить. Кто-нибудь знает? –

ответ

2

Я думаю, что это было связано с путаницей с FOR EACH ROW заявления.
Это только для «соответствующих записей для заявления перед тем триггером вызывается.»

Если существует N числа записей в таблице и сопоставляют записи для where id=x,
при условии x вызывает результат меньше чем N записей, скажем N-5, затем
FOR EACH ROW вызывает цикл для N-5 раз.

ОБНОВЛЕНИЕ:
Тестовый пример запуска на строк, затронутых в связи с FOR EACH ROW заявления приведен ниже.

mysql> -- create a test table 
mysql> drop table if exists tbl; create table tbl (i int, v varchar(10)); 
Query OK, 0 rows affected (0.01 sec) 

Query OK, 0 rows affected (0.06 sec) 

mysql> -- set test data 
mysql> insert into tbl values(1,'one'),(2,'two'),(3,'three'),(10,'ten'),(11,'eleven'); 
Query OK, 5 rows affected (0.02 sec) 
Records: 5 Duplicates: 0 Warnings: 0 

mysql> select * from tbl; 
+------+--------+ 
| i | v  | 
+------+--------+ 
| 1 | one | 
| 2 | two | 
| 3 | three | 
| 10 | ten | 
| 11 | eleven | 
+------+--------+ 
5 rows in set (0.02 sec) 

mysql> select count(*) row_count from tbl; 
+-----------+ 
| row_count | 
+-----------+ 
|   5 | 
+-----------+ 
1 row in set (0.00 sec) 

mysql> 
mysql> -- record loop count of trigger in a table 
mysql> drop table if exists rows_affected; create table rows_affected(i int); 
Query OK, 0 rows affected (0.02 sec) 

Query OK, 0 rows affected (0.05 sec) 

mysql> select count(*) 'rows_affected' from rows_affected; 
+---------------+ 
| rows_affected | 
+---------------+ 
|    0 | 
+---------------+ 
1 row in set (0.00 sec) 

mysql> 
mysql> set @cnt=0; 
Query OK, 0 rows affected (0.00 sec) 

mysql> 
mysql> -- drop trigger if exists trig_bef_del_on_tbl; 
mysql> delimiter // 
mysql> create trigger trig_bef_del_on_tbl before delete on tbl 
    -> for each row begin 
    ->  set @cnt = if(@cnt is null, 1, (@cnt+1)); 
    -> 
    ->  /* for cross checking save loop count */ 
    ->  insert into rows_affected values (@cnt); 
    -> end; 
    -> // 
Query OK, 0 rows affected (0.00 sec) 

mysql> 
mysql> delimiter ; 
mysql> 
mysql> -- now let us test the delete operation 
mysql> delete from tbl where i like '%1%'; 
Query OK, 3 rows affected (0.02 sec) 

mysql> 
mysql> -- now let us see what the loop count was 
mysql> select @cnt as 'cnt'; 
+------+ 
| cnt | 
+------+ 
| 3 | 
+------+ 
1 row in set (0.00 sec) 

mysql> 
mysql> -- now let us see the table data 
mysql> select * from tbl; 
+------+-------+ 
| i | v  | 
+------+-------+ 
| 2 | two | 
| 3 | three | 
+------+-------+ 
2 rows in set (0.00 sec) 

mysql> select count(*) row_count from tbl; 
+-----------+ 
| row_count | 
+-----------+ 
|   2 | 
+-----------+ 
1 row in set (0.00 sec) 

mysql> select count(*) 'rows_affected' from rows_affected; 
+---------------+ 
| rows_affected | 
+---------------+ 
|    3 | 
+---------------+ 
1 row in set (0.00 sec) 

mysql> 
+0

О, это намного больше смысла. Я никогда не понимал, что за каждую строку зацикливается. –

+0

Так ли цикл триггера перед удалением по всем строкам в таблице или выполняется ли для каждого записанного, который удален? Или он запускается один раз для каждой строки, подлежащей удалению? –

+0

@MatKay Я включил проверенный пример в мой обновленный ответ. –