【问题标题】:MYSQL Trigger UPDATE field when data is enteredMYSQL 在输入数据时触发 UPDATE 字段
【发布时间】:2020-09-04 23:19:20
【问题描述】:

我有一个名为 procurement 的 MYSQL 表,其中包含以下列...

| id | province | sample_result | image | status   |
| 1  | prov_1   | 3             | url   | Complete |
| 2  | prov_2   | 12            | NULL  |          |
| 3  | prov_3   | 45            | NULL  |          |
| 4  | prov_4   |               | url   |          |

我想创建一个触发器,当 两个 sample_result 和 image 列都已更新且不再为 NULL 时,该 TRIGGER 将“status”列更新为“Complete”。如果其中任何一个为 NULL,则不需要更新。

【问题讨论】:

    标签: mysql triggers


    【解决方案1】:

    您可以设置 NEW。前触发器中的值,并且因为 mysql 复制 OLD。新的值。在它获得 NEW 之前的值。来自更新的值然后测试新的。值是安全的

    drop table if exists t;
    create table t
    ( id int, province varchar(10), sample_result int, image varchar(10), status varchar(10));
    insert into t values
    ( 1  , 'prov_1'   , 3             , 'url'    , 'Complete'),
    ( 2  , 'prov_2'   , 12            , NULL     ,  null     ),
    ( 3  , 'prov_3'   , 45            , NULL     ,  null     ),
    ( 4  , 'prov_4'   , null          , 'url'    ,  null     );
    
    drop trigger if exists t;
    delimiter $$
    create trigger t before update on t
    for each row
    begin
        if new.sample_result is not null and new.image is not null then
            set new.status = 'Complete';
        end if ;
    end $$
    delimiter ;
    
    update t set sample_result = 2 where id = 2;
    update t set sample_result = 1 where id = 4;
    update t set image = 'url' where id = 3;
    
    select * from t;
    
    +------+----------+---------------+-------+----------+
    | id   | province | sample_result | image | status   |
    +------+----------+---------------+-------+----------+
    |    1 | prov_1   |             3 | url   | Complete |
    |    2 | prov_2   |             2 | NULL  | NULL     |
    |    3 | prov_3   |            45 | url   | Complete |
    |    4 | prov_4   |             1 | url   | Complete |
    +------+----------+---------------+-------+----------+
    

    【讨论】:

    • 这适用于所有版本的 MySQL?我以为你不能在同一张表上使用触发器触发动作。
    • @ikiK'在 BEFORE 触发器中,您还可以使用 SET NEW.col_name = value ' - dev.mysql.com/doc/refman/8.0/en/trigger-syntax.html 更改其值,否则您无法操作(插入/更新/删除)触发扳机。至于所有版本的 mysql 不知道 - 但如果有人更早,肯定会回到 5.6,祝他们好运。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-09
    • 2017-08-03
    • 1970-01-01
    • 2011-01-21
    • 1970-01-01
    • 2018-05-13
    相关资源
    最近更新 更多