問(wèn)題
對(duì)定義了ctime為not null的表婆誓,insert ctime null 在開(kāi)發(fā)環(huán)境可以通過(guò)艰垂,但是部署上線出問(wèn)題了屎开,提示
ERROR 1048 (23000): Column ‘ctime’ cannot be null
分析
Dev env: MySQL 5.6.30
Online env: Mysql 5.7.10
- 對(duì)比表結(jié)構(gòu)
- 對(duì)比執(zhí)行sql
- 考慮可配置參數(shù)
解決方案
表結(jié)構(gòu)一樣
查看關(guān)于insert syntax的文檔
http://dev.mysql.com/doc/refman/5.7/en/insert.html (doc version 5.7) 定義 not null 的字段碉钠,insert null 分兩種情況:
單行會(huì)報(bào)錯(cuò)流妻,1048錯(cuò)誤驹马;
多行會(huì)忽略革砸,如果是時(shí)間字段除秀,會(huì)插入 ‘0000-00-00 00:00:00’按照
https://mariadb.com/kb/en/mariadb/null-values/
的解釋 對(duì)于 AUTO_INCREMENT, TIMESTAMP and virtual columns類型字段,insert null會(huì)特殊處理算利,其他的情況符合2的說(shuō)明册踩。可以影響提示的參數(shù)是sql_mod
http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html 可以查看SQL Mode Changes in MySQL 5.7部分,但也沒(méi)有明確說(shuō)明效拭。開(kāi)發(fā)環(huán)境是Mysql 5.6.30; 線上環(huán)境是Mysql 5.7.11 考慮到版本問(wèn)題對(duì)Mysql
5.6.27 / Mysql 5.7.10 / Mysql 5.6.24 進(jìn)行測(cè)試暂吉,與線上環(huán)境的情況一致。
結(jié)論
綜上缎患,結(jié)合4慕的,5可以判斷為,在定義了not null的字段挤渔,只有5.6.30 insert null會(huì)通過(guò)肮街,屬于特別情況。 屬于版本問(wèn)題判导,建議你如果需要insert null嫉父,就不要定義為not null!
測(cè)試腳本
DROP TABLE IF EXISTS test;
CREATE TABLE `test` (
`id` BIGINT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`number` VARCHAR(20) NOT NULL,
`status` TINYINT(1) NOT NULL DEFAULT '1',
`ctime` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`utime` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `idx_number_UNIQUE` (`number`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='白名單';
SELECT * FROM test;
INSERT INTO test(`status`) VALUE(1);
SELECT * FROM test;
INSERT INTO test(number,`status`,ctime) VALUE(2,2,NULL);
SELECT * FROM test;