赞
踩
例如,
- CREATE TABLE `t` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `c` int(11) DEFAULT NULL,
- `d` int(11) DEFAULT NULL,
- PRIMARY KEY (`id`),
- UNIQUE KEY `c` (`c`)
- ) ENGINE=InnoDB;
-
- insert into t values(null, 1,1);
- insert into t values(null, 2,2);
- insert into t values(null, 3,3);
- insert into t values(null, 4,4);
-
- create table t2 like t
insert into t2(c,d) (select c+1, d from t force index(c) order by c desc limit 1);
这个语句的加锁范围,就是表 t 索引 c 上的 (3,4]和 (4,supremum]这两个 next-key lock,以及主键索引上 id=4 这一行。
它的执行流程也比较简单,从表 t 中按照索引 c 倒序,扫描第一行,拿到结果写入到表 t2 中。因此整条语句的扫描行数是 1。
insert into … on duplicate key update 这个语义的逻辑是,插入一行数据,如果碰到唯一键约束,就执行后面的更新语句。
insert into t values(11,10,10) on duplicate key update d=100;
索引 c 上 (5,10] 加一个排他的 next-key lock(写锁)。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。