Mysql在非空字段上插入或更新为空值时不会出错

标签 mysql null innodb insert-update notnull


我有一张 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 默认为空
我通过

将其更改为 STRICT_ALL_TABLES
SET GLOBAL sql_mode='STRICT_ALL_TABLES'

最佳答案

MySQL 把我今天的一天都搞砸了,所以我只是分享我从中学到的东西。

MySQL 5.6 默认为 NO_ENGINE_SUBSTITUTION

MySQL 5.7 默认为 ONLY_FULL_GROUP_BYSTRICT_TRANS_TABLESNO_ZERO_IN_DATENO_ZERO_DATEERROR_FOR_DIVISION_BY_ZERONO_AUTO_CREATE_USERNO_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/

相关文章:

php - 使用 codeigniter 在 mysql 中连接

mysql - 如何在mysql中动态地将行值设置为列

java - 如何编写 MySql 选择查询,其中 id 不在列表中,可以为空

java - 使数组的元素为空

Mysql - 将空值复制到非空表中

php - 在备份实时 Laravel 应用程序时保持文件夹和表格同步

c++ - 空流,我必须包括 ostream 吗?

MySQL 意外崩溃

InnoDB 表不显示 MySQL FK 字段

php - 如何解决InnoDB引擎中的死锁问题?