Mysql在插入时没有错误或在非空字段上更新为null值

时间:2013-03-05 20:24:45

标签: mysql null innodb insert-update notnull


我有一张桌子

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插入非空字段?
我想要发生错误: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'

2 个答案:

答案 0 :(得分:1)

因为这个问题,我今天因为这个问题而陷入困境,所以我只是分享了我对此的了解。

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。< / p>

如MySQL参考手册中的page所述,

  

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

答案 1 :(得分:0)

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