Mysql ERROR 1067: Invalid default value for字段問題
Mysql ERROR 1067: Invalid default value for字段
問題
//今天把一個數據庫的sql文件導入到另一個數據庫出現以下異常:
Mysql ERROR 1067: Invalid default value for 字段
//原因是因為之前導出數據里面有張表的一個日期字段默認值為0000-00-00,導致現在的錯誤。根本原因是 SQL_MODE 設置值的問題
查詢數據庫有什么引擎:
select table_name,`engine` from information_schema.tables where table_schema = 'database_name';
查詢表引擎(查看MYISAM)
SELECT CONCAT(table_name,'? ', engine)?? FROM information_schema.tables WHERE table_schema="bpm" AND ENGINE="MyISAM"; ?
生成修改sql(把MYISAM改成INNODB)
select CONCAT('alter table ',table_name,' engine=InnoDB;') FROM information_schema.tables WHERE table_schema="bpm" AND ENGINE="MyISAM";
alter table taai_client_dump_date engine=InnoDB;
報此錯:ERROR 1067 (42000): Invalid default value for 'cur_date'
永久解決:
??? vi /etc/my.cnf??? //添加以下配置 ?sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
臨時解決:
set @@sql_mode ='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
MYSQL的sql_mode:
ONLY_FULL_GROUP_BY:
對于GROUP BY聚合操作,如果在SELECT中的列,沒有在GROUP BY中出現,那么將認為這個SQL是不合法的,因為列不在GROUP BY從句中
STRICT_TRANS_TABLES:
在該模式下,如果一個值不能插入到一個事務表中,則中斷當前的操作,對非事務表不做任何限制
NO_ZERO_IN_DATE:
在嚴格模式,不接受月或日部分為0的日期。
如果使用IGNORE選項,我們?yōu)轭愃频娜掌诓迦?#39;0000-00-00'。
在非嚴格模式,可以接受該日期,但會生成警告。
NO_ZERO_DATE:
在嚴格模式,不要將 '0000-00-00'做為合法日期。
你仍然可以用IGNORE選項插入零日期。
在非嚴格模式,可以接受該日期,但會生成警告
ERROR_FOR_DIVISION_BY_ZERO:
在嚴格模式,在INSERT或UPDATE過程中,如果被零除(或MOD(X,0)),則產生錯誤(否則為警告)。
如果未給出該模式,被零除時MySQL返回NULL。
如果用到INSERT IGNORE或UPDATE IGNORE中,MySQL生成被零除警告,但操作結果為NULL。
NO_AUTO_CREATE_USER
防止GRANT自動創(chuàng)建新用戶,除非還指定了密碼。
NO_ENGINE_SUBSTITUTION:
如果需要的存儲引擎被禁用或未編譯,那么拋出錯誤。不設置此值時,用默認的存儲引擎替代,并拋出一個異常
導入SQL時出現 Invalid default value for ‘XXX‘ 報錯
問題如上圖,在進行建表時,報錯 Invalid default value for 'XXX'
原因
MySQL的版本不同,5.6及其以下版本不支持
因為給了時間字段的列默認值一個 CURRENT_TIMESTAMP 默認值,而這個默認值在低版本的 MySQL 中是不支持的,因此就出現了圖中的這個報錯
`reg_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '注冊時間',
解決方案
一:重裝 MySQL 數據庫,版本選擇 5.7 或者 5.7 以上版本
二:將
`reg_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '注冊時間',
改為
`reg_time` datetime DEFAULT NULL COMMENT '注冊時間',
即可
附圖:
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
MySQL中的GROUP_CONCAT()函數詳解與實戰(zhàn)應用小結(示例詳解)
本文介紹了MySQL中的GROUP_CONCAT()函數,詳細解釋了其基本語法、應用示例以及ORDERBY和SEPARATOR參數的使用方法,此外,還提到了該函數的性能限制和注意事項,感興趣的朋友一起看看吧2025-02-02