Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak działa dla każdego wiersza w wyzwalaczach w mysql?

FOR EACH ROW oznacza dla każdego dopasowanego wiersza który zostanie zaktualizowany lub usunięty .

Treść wyzwalacza nie będzie przechodzić przez całe dane tabeli, chyba że w zapytaniu występuje warunek WHERE.

Przykład pracy pokazano poniżej:

Utwórz przykładowe tabele :

drop table if exists tbl_so_q23374151; 
create table tbl_so_q23374151 ( i int, v varchar(10) );

-- set test data
insert into tbl_so_q23374151 
values (1,'one'),(2,'two' ),(3,'three'),(10,'ten'),(11,'eleven');

-- see current data in table**:  
select * from tbl_so_q23374151;
+------+--------+
| i    | v      |
+------+--------+
|    1 | one    |
|    2 | two    |
|    3 | three  |
|   10 | ten    |
|   11 | eleven |
+------+--------+
5 rows in set (0.00 sec)

Przykładowa tabela do rejestrowania liczby pętli w ciele wyzwalacza :

-- let us record, loop count of trigger, in a table
drop table if exists tbl_so_q23374151_rows_affected; 
create table tbl_so_q23374151_rows_affected( i int );

select count(*) as rows_affected from tbl_so_q23374151_rows_affected;
+---------------+
| rows_affected |
+---------------+
|             0 |
+---------------+

Zdefiniuj usuń wyzwalacz :

drop trigger if exists trig_bef_del_on_tbl_so_q23374151;
delimiter //
create trigger trig_bef_del_on_tbl_so_q23374151 before delete on tbl_so_q23374151
  for each row begin
    set @cnt = if(@cnt is null, 1, (@cnt+1));

    /* for cross checking save loop count */
    insert into tbl_so_q23374151_rows_affected values ( @cnt );
  end;
//

delimiter ;

Teraz przetestuj usunięcie operacja :

delete from tbl_so_q23374151 where i like '%1%';

-- now let us see what the loop count was
select @cnt as 'cnt';
+------+
| cnt  |
+------+
|    3 |
+------+

Teraz sprawdź efekt wyzwalacza na głównym stole :

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

select count(*) as rows_affected from tbl_so_q23374151_rows_affected;
+---------------+
| rows_affected |
+---------------+
|             3 |
+---------------+
1 row in set (0.00 sec)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zmienić ZESTAW ZNAKÓW (i UKŁADANIE) w całej bazie danych?

  2. Podzapytanie MySQL — Znajdź tylko pierwszy rekord w LEWYM JOIN

  3. Podłączanie MySQL do Visual Studio C#

  4. Wyzwalacz MySql, zaktualizuj inną tabelę podczas wstawiania

  5. Jak usunąć kaskadę, gdy parentID i childID znajdują się na tej samej tabeli?