当表在MySQL 5.7上有触发器时,列不能为null

时间:2015-11-13 10:25:43

标签: mysql triggers mysql-5.7

我不知道这是预期的行为还是错误,但似乎不正确。使用Ubuntu 14.04 ondrej PPA中的MySQL 5.7.9

摘要:如果表定义了触发器,则应该发出警告(将隐式NULL插入not null列)的操作会引发错误,

 select @@sql_mode;
+------------------------+
| @@sql_mode             |
+------------------------+
| NO_ENGINE_SUBSTITUTION |
+------------------------+
1 row in set (0.00 sec)

show global variables like 'sql_mode';
+---------------+------------------------+
| Variable_name | Value                  |
+---------------+------------------------+
| sql_mode      | NO_ENGINE_SUBSTITUTION |
+---------------+------------------------+
1 row in set (0.00 sec)

show variables like 'sql_mode';
+---------------+------------------------+
| Variable_name | Value                  |
+---------------+------------------------+
| sql_mode      | NO_ENGINE_SUBSTITUTION |
+---------------+------------------------+
1 row in set (0.00 sec)

create table _test (col_1 varchar(20) not null, col_2 varchar(20) not null) engine=myisam charset=utf8;
Query OK, 0 rows affected (0.00 sec)

show columns from _test;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| col_1 | varchar(20) | NO   |     | NULL    |       |
| col_2 | varchar(20) | NO   |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

 insert into _test (col_1) values ('abc');
Query OK, 1 row affected, 1 warning (0.00 sec)

^^^^^^^^^ This is expected behaviour ^^^^^^^^^

delimiter $$

create trigger `insert_test` before insert on `_test` for each row begin set NEW.col_1 = concat(NEW.col_1, '+test'); end$$
Query OK, 0 rows affected (0.02 sec)

delimiter ;

insert into _test (col_1) values ('abc');
ERROR 1048 (23000): Column 'col_2' cannot be null

^^^^^^^^^ This is UNexpected behaviour ^^^^^^^^^

因此,当设置触发器时,相同模式下的相同命令具有不同的结束状态。

任何人都可以看到这个错误,有没有人遇到类似的问题,或者这是发布中的错误?

更新

5.6.19(也在Ubuntu 14.04上)测试了相同的过程后,最后一行返回:

insert into _test (col_1) values ('abc');
Query OK, 1 row affected, 1 warning (0.01 sec)

这又是预期的行为。

更新2

对MySQL开发团队来说已经submitted as a bug,现在处于已验证的状态。

0 个答案:

没有答案