Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL触发器-总结json格式列中的更改_Mysql_Json_Triggers_Concat - Fatal编程技术网

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

MySQL触发器-总结json格式列中的更改,mysql,json,triggers,concat,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

我正在尝试为我的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`)
);
其中contact_id是我要监视的表的外键,在列中,我要存储使用JSON格式所做的更改

因此,如果我更改联系人表中某个条目的familyname和birthday,则更改列应包含
{“familyname”:“Smith”,“birthday”:“1982-06-24}

我找到了很多使用触发器跟踪更改的示例,但没有一个示例总结了在单行的单个列中所做的更改。它们所做的是为每个更改插入一个新行,即一行用于更改生日,另一行用于更改familyname

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

有什么想法或提示可以解决这个问题吗

谢谢


编辑:将以前的编辑作为答案发布。

好吧,我自己解决了。不是很难吗…;)


例如,您是否处理过OLD.name或NEW.name为null的情况。对于@json,插入的值将为null。如果NEW.name具有双引号字符怎么办?
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 ;