首页 > 解决方案 > MySQL 触发器在许多 int (0/1) 上更新 varchar depwnding

问题描述

我有一个这样的表

+-------------+---------------------+------+-----+---------+----------------+
| Field       | Type                | Null | Key | Default | Extra          |
+-------------+---------------------+------+-----+---------+----------------+
| _id         | int(10) unsigned    | NO   | PRI | NULL    | auto_increment |
| name        | varchar(100)        | NO   |     | NULL    |                |
| kategori    | varchar(50)         | NO   |     | NULL    |                |
| GR          | int(1)              | NO   |     | NULL    |                |
| WW          | int(1)              | NO   |     | NULL    |                |
| FS          | int(1)              | NO   |     | NULL    |                |
+-------------+---------------------+------+-----+---------+----------------+

我想Kategori每次都更新GRWW或者FS被改变了。

而 if GR, WWor FSis1的值应该是GR, WW, FSfor kategori

IF GR=1WW=0并且FS=1值应该是GR, FS类别等。

我找不到可以工作的触发器。

标签: mysqlsql

解决方案


以下触发器应该可以解决问题。

在更新表之前运行,如果没有为该kategory字段指定值,则检查 、 和 的值GRWW设置FS它。

触发器认识到UPDATE可能会在未设置所有 3 个字段的情况下发生的事实:在这种情况下,它会查找数据库中字段的现有值。这应该允许kategori在这种情况下与数据保持同步。

delimiter $$
CREATE TRIGGER updateMyTable
BEFORE UPDATE ON my_table
FOR EACH ROW 
BEGIN
    IF NEW.kategori IS NULL THEN
        IF COALESCE(NEW.GR, OLD.GR) = 1 THEN 
            SET NEW.kategori = IF( NEW.kategori IS NULL, 'GR', CONCAT(NEW.kategori, ',', 'GR') );
        END IF;
        IF COALESCE(NEW.WW, OLD.WW) = 1 THEN 
            SET NEW.kategori = IF( NEW.kategori IS NULL, 'WW', CONCAT(NEW.kategori, ',', 'WW') );
        END IF;
        IF COALESCE(NEW.FS, OLD.FS) = 1 THEN 
            SET NEW.kategori = IF( NEW.kategori IS NULL, 'FS', CONCAT(NEW.kategori, ',', 'FS') );
        END IF;
    END IF;
END$$
delimiter ;

推荐阅读