我有2个MySQL表名上传和 uploads_log 。
在上传表的更新后,我编写了一个触发器,只将 uploads.json_values 的全部内容放入 uploads_log 表的old_value中, NEW_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可能会有所帮助。在当前行格式中,760字节的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触发器无关。
非常感谢任何帮助/建议。
感谢。
答案 0 :(得分:1)
我也有一些类似的问题,但没有触发这个question帮助我。
将位于innodb_log_file_size
(,如果您使用XAMPP )的C:\xampp\mysql\bin\my.ini
值更改为高于5M的值。
或者@Vatev指出,您可以设置innodb_log_file_size = 128M
您可以使用此MySQL命令获取innodb_log_file_size
值,它将以字节为单位显示结果。