2016-11-29 80 views
1

我有2個MySQL表名上傳uploads_log觸發器不能使用longtext字段

  • 上傳表具有字段名稱json_values(數據類型:LONGTEXT)
  • uploads_log表具有2個字段OLD_VALUENEW_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 questionthis one,但它UPDATE觸發器是沒有關係的。

任何幫助/建議將非常感激。

謝謝。

+0

請添加顯示創建表的輸出 – e4c5

+0

看看[這個答案](http://stackoverflow.com/a/25578580/1541403) – Vatev

+0

@ e4c5:我更新了我的問題與表結構。和Vatev我也在閱讀這個答案,但很難消化它。所以使用Google搜索。 –

回答

1

我也有類似的問題,但沒有觸發這個question幫助我。

更改innodb_log_file_size值位於C:\xampp\mysql\bin\my.ini如果您使用XAMPP)到高於5M的東西。

或由@Vatev指出,你可以設置innodb_log_file_size = 128M

您可以使用此MySQL命令來獲取innodb_log_file_size價值,它會給你的結果字節。

+0

謝謝,它在本地/ dev服務器上爲我工作,但有沒有其他方式來實現這一點,因爲我不知道我會有任何選項來更改共享主機上的MySQL配置。 –