sql >> データベース >  >> RDS >> Mysql

mysqlのトリガーでは各行がどのように機能しますか?

    FOR EACH ROW 一致した行ごとにを意味します 更新されます または削除済み

    クエリにwhere条件がない限り、トリガー本体はテーブルデータ全体をループしません。

    実用的な例を以下に示します。

    サンプルテーブルを作成する

    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)
    

    トリガー本体にループカウントを記録するためのサンプルテーブル

    -- 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 |
    +---------------+
    

    削除を定義する トリガー

    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 ;
    

    次に、削除をテストします 操作

    delete from tbl_so_q23374151 where i like '%1%';
    
    -- now let us see what the loop count was
    select @cnt as 'cnt';
    +------+
    | cnt  |
    +------+
    |    3 |
    +------+
    

    次に、メインテーブルのトリガー効果を確認します

    -- 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. MySQL-テーブルの作成中に一緒に使用された場合のPRIMARYKEY、UNIQUE KEY、およびKEYの意味

    2. MySQLに複数の行を挿入する方法

    3. OracleのTO_DATE()関数

    4. 変数を割り当てるときのSETとSELECT?