我有2個MySQL表名上傳和uploads_log。觸發器不能使用longtext字段
- 上傳表具有字段名稱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
下了扳機工作正常,但是當林EDITTING一些真的很長的字符串像長378369字符。我收到以下錯誤。
SQLSTATE [42000]:語法錯誤或訪問衝突:1118行大小過大(> 8126)。將某些列更改爲TEXT或BLOB或使用ROW_FORMAT = DYNAMIC或ROW_FORMAT = COMPRESSED可能會有幫助。在當前行格式中,768字節的BLOB前綴以內聯方式存儲。
我嘗試調試我刪除了觸發和編輯uploads.json_values
長字符串,workes精細的問題,我手動插入的長串入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觸發器是沒有關係的。
任何幫助/建議將非常感激。
謝謝。
請添加顯示創建表的輸出 – e4c5
看看[這個答案](http://stackoverflow.com/a/25578580/1541403) – Vatev
@ e4c5:我更新了我的問題與表結構。和Vatev我也在閱讀這個答案,但很難消化它。所以使用Google搜索。 –