【发布时间】:2017-04-13 09:38:36
【问题描述】:
我有 2 个 MySQL 表名 uploads 和 uploads_log。
- uploads 表有一个字段名json_values(数据类型:longtext)
- uploads_log 表有 2 个字段 old_value,new_value(数据类型:longtext)
在 uploads 表的 UPDATE 之后,我编写了一个触发器,它将 uploads.json_values 的全部内容放入 uploads_log 表的 old_value 中,新值。
触发是
BEGIN
IF (NEW.json_values != OLD.json_values) THEN
INSERT INTO uploads_log (`file_id`, `user_id`, `field_name`, `old_value`, `new_value`, `ip`, `created_at`)
VALUES (OLD.`file_id`,
OLD.`user_id`,
'json_values',
OLD.json_values,
NEW.json_values,
NEW.user_ip,
NOW());
END IF;
END
我的问题是:当我在 uploads.json_values 中编辑小字符串时,我的触发器工作正常,但是当我编辑一些非常长的字符串时,例如 378369 个字符长 .我收到以下错误。
SQLSTATE[42000]:语法错误或访问冲突:1118 行大小太大 (> 8126)。将某些列更改为 TEXT 或 BLOB 或使用 ROW_FORMAT=DYNAMIC 或 ROW_FORMAT=COMPRESSED 可能会有所帮助。在当前行格式中,768 字节的 BLOB 前缀是内联存储的。
我尝试调试删除触发器并使用长字符串编辑uploads.json_values 的问题,它可以正常工作,我手动将该长字符串插入uploads_log.old_value,然后它也可以正常工作,所以问题出在触发器上。
触发器是否有长度限制?
两个表都使用存储引擎:InnoDB 和 MySQL 版本是 5.6.21。
uploads表结构
CREATE TABLE `uploads` (
`file_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(11) unsigned NOT NULL,
`json_values` longtext COLLATE utf8_unicode_ci NOT NULL,
`read_values` longtext COLLATE utf8_unicode_ci,
`user_ip` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
PRIMARY KEY (`file_id`),
KEY `user_id` (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=34444 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
uploads_log表结构
CREATE TABLE `uploads_log` (
`action_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`file_id` int(11) unsigned DEFAULT NULL,
`user_id` int(11) unsigned DEFAULT NULL,
`field_name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`old_value` longtext COLLATE utf8_unicode_ci,
`new_value` longtext COLLATE utf8_unicode_ci,
`ip` varchar(30) COLLATE utf8_unicode_ci DEFAULT NULL,
`created_at` datetime DEFAULT NULL,
PRIMARY KEY (`action_id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
我找到了this question和this one,但它与UPDATE触发器无关。
非常感谢任何帮助/建议。
谢谢。
【问题讨论】:
-
请添加 show create table 的输出
-
@e4c5:我已经用表格结构更新了我的问题。和 Vatev 我也在阅读这个答案,但很难消化它。所以谷歌搜索它。
-
触发器在哪个表上?
-
@e4c5: 触发器写入
uploads表中,并在表更新后触发。
标签: mysql triggers phpmyadmin