mysql配置sql_mode中STRICT_TRANS_TABLES和STRICT_ALL_TABLES 区别

mysql配置sql_mode中STRICT_TRANS_TABLES和STRICT_ALL_TABLES 区别

作者:myadmin |  时间:2016-06-28 |  浏览:3061 |  0 条评论

mysql配置sql_mode中STRICT_TRANS_TABLES和STRICT_ALL_TABLES 区别

今天无意间看到 mysql sql_mode 这个配置,就仔细看下了下,做个记录备忘下。

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

查阅了一下线上一台服务器,sql_mode的配置是  STRICT_TRANS_TABLES

STRICT_TRANS_TABLES 和STRICT_ALL_TABLES 区别,简要说明下

mysql的官方说明中提出:
严格模式控制MySQL如何处理非法或丢失的输入值。有几种原因可以使一个值为非法。例如,数据类型错误,不适合列,或超出范围。当新插入的行不包含某列的没有显示定义DEFAULT子句的值,则该值被丢失。
 
对于事务表,当启用STRICT_ALL_TABLES或STRICT_TRANS_TABLES模式时,如果语句中有非法或丢失值,则会出现错误。语句被放弃并滚动。
 
对于非事务表,如果插入或更新的第1行出现坏值,两种模式的行为相同。语句被放弃,表保持不变。如果语句插入或修改多行,并且坏值出现在第2或后面的行,结果取决于启用了哪个严格选项:
 
· 对于STRICT_ALL_TABLES,MySQL返回错误并忽视剩余的行。但是,在这种情况下,前面的行已经被插入或更新。这说明你可以部分更新,这可能不是你想要的。要避免这点,最好使用单行语句,因为这样可以不更改表即可以放弃。
 
· 对于STRICT_TRANS_TABLES,MySQL将非法值转换为最接近该列的合法值并插入调整后的值。如果值丢失,MySQL在列中插入隐式 默认值。在任何情况下,MySQL都会生成警告而不是给出错误并继续执行语句。
 
以下是一个例子分析:
1:如果sql语句操作的是事务表(innodb类型)的时候,STRICT_ALL_TABLES或STRICT_TRANS_TABLES模式对数据的影响是一样的。
需要注意的是:
在事务中如果某个sql更新数据的语句报错,那么这条语句下面的未语句都不会执行,这条语句上面已经执行的语句会事务结束的时候commit
这是需要我们捕捉错误,让事务回滚。
 
例子如下:
CREATE TABLE `t1` (
  `f1` int(11) NOT NULL AUTO_INCREMENT,
  `f2` varchar(2) NOT NULL,
  UNIQUE KEY `f1` (`f1`)
) ENGINE=innodb AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC
 
DELIMITER $$
 
DROP PROCEDURE IF EXISTS `pr_test`$$
 
CREATE DEFINER=`root`@`127.0.0.1` PROCEDURE `pr_test`()
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN ROLLBACK;END;
   START TRANSACTION;
INSERT INTO t1 (f2) VALUES (‘cd’);
INSERT INTO t1 (f2) VALUES (‘abc’);
INSERT INTO t1 (f2) VALUES (‘de’);
COMMIT;
    END$$
 
DELIMITER ;
 
2:如果sql语句操作的是事务表。
两个区别是
INSERT INTO t1 (f2) VALUES (‘ab’),(‘acd’);
如果是STRICT_ALL_TABLES
结果是:
f1    f2
1     ab
如果是STRICT_TRANS_TABLES
结果是:
f1    f2
1     ab
2     ac


mysql配置sql_mode中STRICT_TRANS_TABLES和STRICT_ALL_TABLES 区别

标签:

相关推荐
更多

发表评论