对于STRICT_ALL_TABLES,MySQL返回一个错误并忽略其余行。但是,由于前面的行已经插入或更新,因此结果是部分更新。为了避免这种情况,可以使用单行语句,该语句可以在不更改表的情况下中止。
对于STRICT_TRANS_TABLES,MySQL将无效值转换为该列最接近的有效值,并插入调整后的值。如果缺少值,MySQL将插入列数据类型的隐式默认值。在任何一种情况下,MySQL都会生成一个警告而不是错误,并继续处理该语句。第11.6节"数据类型默认值"中描述了隐式默认值。
我尝试设置STRICT_TRANS_TABLE,并尝试在没有事务的情况下插入无效记录。尽管有记录,但它显示了一个错误。
mysql> show create table mydemo;
+--------+-------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+--------+-------------------------------------------------------------------------------------------------------------------------------------------------+
| mydemo | CREATE TABLE `mydemo` (
`pk` int(20) NOT NULL,
`name` varchar(10) DEFAULT NULL,
PRIMARY KEY (`pk`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+--------+-------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> SELECT * FROM mydemo;
+----+------+
| pk | name |
+----+------+
| 1 | Test |
+----+------+
1 row in set (0.00 sec)
mysql> SELECT @@SESSION.sql_mode;
+-------------------------------------------------------------------------------------------------------------------------------------------+
| @@SESSION.sql_mode |
+-------------------------------------------------------------------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+-------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> insert into mydemo values (2, "abcdefghijklmn");
ERROR 1406 (22001): Data too long for column 'name' at row 1
mysql> select @@SESSION.autocommit;
+----------------------+
| @@SESSION.autocommit |
+----------------------+
| 1 |
+----------------------+
1 row in set (0.00 sec)
- 他们所说的非事务表是什么意思
- 在上面,为什么它显示错误而不是警告
- 如果两种模式都设置好了怎么办
您的表类型是innodb,这是一种事务性表类型(支持事务(,因此您引用的两个表之前的一段适用:
对于事务性表,当启用STRICT_ALL_tables或STRICT_TRANS_tables时,数据更改语句中的无效值或缺失值会出错。该语句被中止并回滚。
您引用的两段适用于非事务性表,如myisam。