您的位置:首页 > 数据库 > MySQL

MySQL数据库中MyISAM存储引擎和InnoDB存储引擎在遇到未定义的值时的处理方式

2017-01-08 22:37 344 查看
在MySQL数据库中,MyISAM存储引擎和InnoDB存储引擎在处理INSERT、UPDATE等操作时,有这很大的区别;在这里呢,我只记录下两者在表中的转换使用,以备后用并分享给大家。

首先呢,创建一个表以借之来说明今天的主旨(该表是用LIST分区的方式建表):

CREATE TABLE t(

a int,

b int)engine=myisam

partition by list(b)(

partition p0 values in (1,3,5,7,9),

partition p1 value in (0,2,4,6,8)

) ;
下面呢插入一些数据至该表中,

INSERT INTO t values(1,2),(2,4),(6,10),(5,3);
当执行该语句时,会报错,原因呢,就是第三个插入值(6,10)中的10不在表的约束条件之内。

但是当我去执行SELECT * FROM t;后发现,表中已经有了两条数据,即(1,2),(2,4)插入成功了。

以此说明MyISAM存储引擎在遇到分区未定义的值时,会将之前的行数据都插入,但之后的数据不会被插入。那么InnoDB会怎样处理呢?

下面我们把目光投向InnoDB:

--myisam==>innodb

ALTER TABLE t engine=innodb;

--继续插入上面的数据

INSERT INTO t values (1,2),(2,4),(6,10),(5,3);

意料之中,同样的报错了,因为之前说过,有未定义的值。

--查看结果

SELECT * FROM t;
显示表中为空;

到这,已经很显然了,InnoDB存储引擎在遇到分区未定义的值时,不会将之前的行数据插入,其实呢,在遇到这种情况时,InnoDB会将其视为一个事务来处理,因此没有任何数据插入。

综上,在使用分区时,也需要对不同存储引擎的支持的事务特性进行考虑了。

^_^很晚了,写到这里吧,这里只是对这些容易忘记的知识进行总结,希望能增加记忆,做到融会贯通,晚安!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息