我在使用 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) 并且我有相同的行为。
现在如果我这样做
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)
在卡罗利·纳吉看来,
您可以使用
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 上测试