我有一张 table
CREATE TABLE `devicelist` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`ip` varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL,
`serial` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`networkname` varchar(200) COLLATE utf8_unicode_ci DEFAULT NULL,
`login` varchar(130) COLLATE utf8_unicode_ci DEFAULT NULL,
`password` varchar(130) COLLATE utf8_unicode_ci DEFAULT NULL,
`peopleid` int(10) unsigned NOT NULL,
`deviceid` int(10) unsigned NOT NULL,
`placeid` int(10) unsigned NOT NULL,
`stationid` int(10) unsigned NOT NULL,
`place` text COLLATE utf8_unicode_ci,
`date` date NOT NULL,
`active` tinyint(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `placeid` (`placeid`),
KEY `stationid` (`stationid`),
KEY `peopleid` (`peopleid`),
KEY `deviceid` (`deviceid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
如您所见,serial 设置为 NOT NULL,
但是当我运行类似
UPDATE DeviceList SET serial = NULL WHERE id = 1
输出
1 row affected. ( Query took 0.0079 sec )
为什么要在非空字段中插入空值?
我希望发生错误:D
///********************************* 编辑
我找到答案了
问题出在 sql_mode
https://dev.mysql.com/doc/refman/5.6/en/sql-mode.html#sql-mode-strict
我的 sql_mode 默认为空
我通过
SET GLOBAL sql_mode='STRICT_ALL_TABLES'
最佳答案
MySQL 把我今天的一天都搞砸了,所以我只是分享我从中学到的东西。
MySQL 5.6 默认为 NO_ENGINE_SUBSTITUTION
。
MySQL 5.7 默认为 ONLY_FULL_GROUP_BY
、STRICT_TRANS_TABLES
、NO_ZERO_IN_DATE
、NO_ZERO_DATE
、ERROR_FOR_DIVISION_BY_ZERO
,NO_AUTO_CREATE_USER
,NO_ENGINE_SUBSTITUTION
。
如本 page 所述来自 MySQL 引用手册,
MySQL installation programs may configure the SQL mode during the installation process. For example, mysql_install_db creates a default option file named my.cnf in the base installation directory.
关于Mysql在非空字段上插入或更新为空值时不会出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15233371/