MySQL触发器 - 汇总json格式列中的更改

sig*_*ter 3 mysql json triggers concat

我正在尝试为我的MySQL表创建一些触发器以跟踪更改.我想到了一张桌子

CREATE TABLE IF NOT EXISTS `contacts_changes` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `action` enum('insert','update','delete') NOT NULL,
  `contact_id` int(6) NOT NULL,
  `changes` text NOT NULL,
  PRIMARY KEY (`id`)
);
Run Code Online (Sandbox Code Playgroud)

其中contact_id是我要监视的表的外键,在列更改中我想存储使用JSON格式进行的更改.

因此,如果我更改联系人表格中的条目的姓氏和生日,则更改列应包含{"familyname": "Smith", "birthday": "1982-06-24}.

我发现了许多使用触发器跟踪更改的示例,但没有一个示例总结了单行中单个列所做的更改.他们所做的是为每次更改插入一个新行,即一行用于更改生日,另一行用于更改姓氏.

由于我对(我的)SQL语言缺乏了解,我没有弄清楚是否可以做我想到的事情以及它是如何完成的.

任何想法或提示如何解决这个问题?

谢谢!

编辑:发布前编辑作为答案.

sig*_*ter 5

好吧,自己解决了.不是那么难......;)

DELIMITER ;;
CREATE TRIGGER `contacts_bu` BEFORE UPDATE ON `contacts` FOR EACH ROW
BEGIN
SET @json = "{";
SET @first = true;
IF (OLD.name!=NEW.name) THEN
    SET @first = false;
    SET @json = CONCAT(@json, "\"name\"", ":", "\"", NEW.name, "\"");
END IF;
IF (OLD.birthdate!=NEW.birthdate) THEN
    IF (!@first) THEN
       SET @json = CONCAT(@json, ",");
    END IF;
    SET @first = false;
    SET @json = CONCAT(@json, "\"birthdate\"", ":", "\"", NEW.birthdate, "\"");
END IF;

SET @json = CONCAT(@json, "}");

INSERT INTO contacts_changes (`action`, `contact_id`, `changes`) 
VALUES ('update', NEW.id, @json);

END;;
DELIMITER ;
Run Code Online (Sandbox Code Playgroud)

  • 例如,当OLD.name或NEW.name为null时,您是否处理过该案例?对于@json,插入的值将为NULL. (2认同)