MySQL Trigger, который обновляет varchar depwnding на многих int (0/1) - PullRequest
0 голосов
/ 27 декабря 2018

У меня есть такая табличка

+-------------+---------------------+------+-----+---------+----------------+
| 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 каждый раз, когда GR, WW или FS изменяется.

И если GR, WW или FS равно 1 значение должно быть GR, WW, FS для kategori.

IF GR=1, WW=0 и FS=1 значение должно быть GR, FSдля категории и т. д.

Я не могу получить триггер, который будет работать.

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Если ваша версия поддерживает ее, вы можете использовать сгенерированные столбцы https://dev.mysql.com/doc/refman/5.7/en/create-table-generated-columns.html, например,

DROP TABLE IF EXISTS T;
create table t(id int auto_increment primary key,gw int,ww int, fs int
,category varchar(100) as (
case 
        when gw = 1 and ww = 1 and fs = 1 then 'gw,ww,fs'
        when gw = 1 and ww = 1 then 'gw,ww'
        when gw = 1 and fs = 1 then 'gw,fs'
        when gw = 1 and fs = 1 then 'gw,fs'
        when ww = 1 and fs = 1 then 'ww,fs'
        when gw = 1 then 'gw'
        when ww = 1 then 'ww'
        when fs = 1 then 'fs'
        else null
        end 
        )
);

insert into t (gw,ww,fs) values 
(1,1,1),
(1,1,0),
(1,0,0),
(0,1,1),
(0,0,1),
(1,0,1);

select *,
        case 
        when gw = 1 and ww = 1 and fs = 1 then 'gw,ww,fs'
        when gw = 1 and ww = 1 then 'gw,ww'
        when gw = 1 and fs = 1 then 'gw,fs'
        when gw = 1 and fs = 1 then 'gw,fs'
        when ww = 1 and fs = 1 then 'ww,fs'
        when gw = 1 then 'gw'
        when ww = 1 then 'ww'
        when fs = 1 then 'fs'
        else null
        end  cat
from t;

+----+------+------+------+----------+----------+
| id | gw   | ww   | fs   | category | cat      |
+----+------+------+------+----------+----------+
|  1 |    1 |    1 |    1 | gw,ww,fs | gw,ww,fs |
|  2 |    1 |    1 |    0 | gw,ww    | gw,ww    |
|  3 |    1 |    0 |    0 | gw       | gw       |
|  4 |    0 |    1 |    1 | ww,fs    | ww,fs    |
|  5 |    0 |    0 |    1 | fs       | fs       |
|  6 |    1 |    0 |    1 | gw,fs    | gw,fs    |
+----+------+------+------+----------+----------+
6 rows in set (0.00 sec)

update t set gw = 0 where id = 1;

+----+------+------+------+----------+-------+
| id | gw   | ww   | fs   | category | cat   |
+----+------+------+------+----------+-------+
|  1 |    0 |    1 |    1 | ww,fs    | ww,fs |
|  2 |    1 |    1 |    0 | gw,ww    | gw,ww |
|  3 |    1 |    0 |    0 | gw       | gw    |
|  4 |    0 |    1 |    1 | ww,fs    | ww,fs |
|  5 |    0 |    0 |    1 | fs       | fs    |
|  6 |    1 |    0 |    1 | gw,fs    | gw,fs |
+----+------+------+------+----------+-------+

Я оставлю вас работать с перестановками gw, ww, fs

0 голосов
/ 27 декабря 2018

Следующий триггер должен помочь.

Он запускает перед обновлением таблицы и, если значение для поля kategory не задано, проверяет значения GR, WW и 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 ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...