4


我有一张桌子

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;

如您所见,序列设置为NOT NULL
但是当我运行查询时

UPDATE DeviceList SET serial = NULL WHERE id = 1

它输出

1 row affected. ( Query took 0.0079 sec )

为什么将 null 插入非 null 字段?
我希望发生错误: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'
4

2 回答 2

2

由于这个原因,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.

如MySQL 参考手册中的本页所述,

MySQL 安装程序可能会在安装过程中配置 SQL 模式。例如,mysql_install_db在基本安装目录中创建一个名为my.cnf的默认选项文件。

于 2016-10-20T05:13:39.493 回答
0

它应该并且确实会引发错误。我猜create table您在问题中发布的内容与实际的表定义不符(考虑到您有语法错误 - 额外的逗号)。

于 2013-03-05T20:34:21.773 回答