触发器不使用longtext字段

时间:2016-11-29 11:42:53

标签: mysql triggers phpmyadmin

我有2个MySQL表名上传 uploads_log

  • 上传表的字段名称为 json_values (数据类型:longtext)
  • uploads_log 表有2个字段 old_value new_value (两种数据类型:longtext)

上传表的更新后,我编写了一个触发器,只将 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 questionthis one,但它与UPDATE触发器无关。

非常感谢任何帮助/建议。

感谢。

1 个答案:

答案 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值,它将以字节为单位显示结果。