我不知道这是预期的行为还是错误,但它似乎不正确。5.7.9
从Ubuntu 14.04 ondrej PPA使用 MySQL 。
摘要:应该引发警告的操作(将隐式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 开发团队,现在处于验证状态。