Mysql 非空列接受空值

ddu*_*tra 9 mysql

我在使用 Mysql not null 列时遇到问题。似乎我的 mysql 安装接受 NOT NULL 列的空值。

我的mysql版本是5.6.25-1~dotdeb+7.1(debian)。

以这张表为例:

CREATE TABLE `cities` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `state_id` int(10) unsigned NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5562;
Run Code Online (Sandbox Code Playgroud)

当我插入这样的值时:

insert into cities(state_id) values (20);
Run Code Online (Sandbox Code Playgroud)

Mysql 会发出警告,但无论如何都会提交该值。这是警告。

12:51:43    insert into cities(state_id) values (20)    1 row(s) affected, 1 warning(s): 1364 Field 'name' doesn't have a default value 0.000 sec
Run Code Online (Sandbox Code Playgroud)

如果我删除唯一键 unique_city_in_state 我会得到相同的行为。

我还尝试使用 DEFAULT NULL 创建名称列,如下所示:

  `name` varchar(255) NOT NULL DEFAULT NULL,
Run Code Online (Sandbox Code Playgroud)

这会溢出一个错误,大致可以转换为(名称的默认值无效)。

我尝试了不同的 mysql 安装 5.1.73-1 (Debian) 并且我有相同的行为。

如何在名称列上使用 NULL 值?

在此处输入图片说明

现在如果我这样做

insert into cities (name, state_id) values (null, 19);
Run Code Online (Sandbox Code Playgroud)

我收到 ERROR 1048 (23000) 意味着列名不能为空。

欢迎任何帮助。

Kár*_*agy 10

它实际上不接受 NULL 值,它认为它是空字符串。那是因为您的服务器处于非严格模式。它控制 MySQL 如何处理插入和更新中的无效或缺失值。您可以在此处阅读有关模式的更多信息:http : //dev.mysql.com/doc/refman/5.6/en/sql-mode.html#sql-mode-strict

mysql> insert into cities(state_id) values (20);
Query OK, 1 row affected, 1 warning (0.07 sec)

mysql> show warnings;
+---------+------+-------------------------------------------+
| Level   | Code | Message                                   |
+---------+------+-------------------------------------------+
| Warning | 1364 | Field 'name' doesn't have a default value |
+---------+------+-------------------------------------------+

mysql> select name is null from cities where id = LAST_INSERT_ID();
+--------------+
| name is null |
+--------------+
|            0 |
+--------------+
1 row in set (0.00 sec)

mysql> SET sql_mode = 'STRICT_ALL_TABLES';
Query OK, 0 rows affected (0.00 sec)

mysql> insert into cities(state_id) values (20);
ERROR 1364 (HY000): Field 'name' doesn't have a default value
Run Code Online (Sandbox Code Playgroud)


Jay*_*zzo 7

卡罗利·纳吉看来

您可以使用

SET SQL_MODE = 'STRICT_ALL_TABLES';
Run Code Online (Sandbox Code Playgroud)

我相信您可能已经知道,但这相当于:

SET @@SESSION.SQL_MODE = 'STRICT_ALL_TABLES';
Run Code Online (Sandbox Code Playgroud)

其中,必须为每个会话设置。您可以通过在上述语句之后运行它来检查这一点。

SELECT @@SESSION.SQL_MODE; -- 'STRICT_ALL_TABLES'

SELECT @@GLOBAL.SQL_MODE; -- 'NO_ENGINE_SUBSTITUTION'
Run Code Online (Sandbox Code Playgroud)

如果您有访问权限,请在全局级别进行设置:

SET @@GLOBAL.SQL_MODE = 'STRICT_ALL_TABLES';
Run Code Online (Sandbox Code Playgroud)

这成为此后每个新会话的默认设置。

干杯,杰伊;-]

注意:在 MySQL 版本 5.6.23-log 和 MySQL Workbench 6.2.5 上测试