MySQL”替换成“的坑自增id、备机会有问题,这个问题在mysql5.7.17上是不会出现
以下是网上资料,
来源于:http://www.cnblogs.com/monian/archive/2014/10/09/4013784.html
MySQL”替换成“的坑
MySQL对SQL有很多扩展,有些用起来很方便,但有一些被误用之后会有性能问题,还会有一些意料之外的副作用,比如取代。
比如有这样一张表:
CREATE TABLE “汽车”,( “id”才能,int (10), unsigned NOT NULL AUTO_INCREMENT, “k”才能,int (10), unsigned NOT 空, “v”,才能varchar (100), DEFAULT 空, “额外的”,才能varchar (200), DEFAULT 空, PRIMARY 才能;KEY (id), UNIQUE 才能;KEY “uk_k”, (“k”) ),引擎=InnoDB
汽车表有一个自增的id字段作为主键,字段k有唯一键做唯一性约束。写入几条记录之后会是这样:
xupeng@diggle7:3600 (dba_m), (dba), mysql>, INSERT INTO auto (k, v,额外的),VALUES (1),“1”,“extra 1”),, (2, ' 2 ',, extra 2),, (3, ' 3 ',, extra 3); Query 好吧,,3,rows affected (0.01,秒) 记录:3,,重复:,0,,警告:0 xupeng@diggle7:3600 (dba_m), (dba), mysql>, SHOW CREATE TABLE 汽车\ G * * * * * * * * * * * * * * * * * * * * * * * * * * *,1只row * * * * * * * * * * * * * * * * * * * * * * * * * * * ,,,,,,表:汽车 Create 表:,Create TABLE “汽车”,( “id”才能,int (10), unsigned NOT NULL AUTO_INCREMENT, “k”才能,int (10), unsigned NOT 空, “v”,才能varchar (100), DEFAULT 空, “额外的”,才能varchar (200), DEFAULT 空, PRIMARY 才能;KEY (id), UNIQUE 才能;KEY “uk_k”, (“k”) ),引擎=InnoDB AUTO_INCREMENT=4, DEFAULT CHARSET=latin1。中的一个 1,row set 拷贝;(0.01,sec)
xupeng@diggle7:3600 (dba_m), (dba), mysql>, SELECT *,得到汽车; + - - - + - - - + - - - - - - - - - - - - - - - - - - + + | |,id k |, v ,,, |, extra , | + - - - + - - - + - - - - - - - - - - - - - - - - - - + + |,,1,|,1,|,1,,,,|,extra 1 | |,,2,|,2,|,2,,,,|,extra 2 | |,,3,|,3,|,3,,,,|,extra 3 | + - - - + - - - + - - - - - - - - - - - - - - - - - - + + 3,rows set 拷贝;(0.00,sec)
在奴隶节点上是和主人一致的:
xupeng@diggle8:3600 (dba_s), (dba), mysql>, SELECT *,得到汽车; + - - - + - - - + - - - - - - - - - - - - - - - - - - + + | |,id k |, v ,,, |, extra , | + - - - + - - - + - - - - - - - - - - - - - - - - - - + + |,,1,|,1,|,1,,,,|,extra 1 | |,,2,|,2,|,2,,,,|,extra 2 | |,,3,|,3,|,3,,,,|,extra 3 | + - - - + - - - + - - - - - - - - - - - - - - - - - - + + 3,rows set 拷贝;(0.00,sec) xupeng@diggle8:3600 (dba_s), (dba), mysql>, SHOW CREATE TABLE 汽车\ G * * * * * * * * * * * * * * * * * * * * * * * * * * *,1只row * * * * * * * * * * * * * * * * * * * * * * * * * * * ,,,,,,表:汽车 Create 表:,Create TABLE “汽车”,( “id”才能,int (10), unsigned NOT NULL AUTO_INCREMENT, “k”才能,int (10), unsigned NOT 空, “v”,才能varchar (100), DEFAULT 空, “额外的”,才能varchar (200), DEFAULT 空, PRIMARY 才能;KEY (id), UNIQUE 才能;KEY “uk_k”, (“k”) ),引擎=InnoDB AUTO_INCREMENT=4, DEFAULT CHARSET=latin1。中的一个 1,row set 拷贝;(0.00,sec)
可以看的到,写入三条记录之后,自动表的AUTO_INCREMENT增长为4,也就是说下一条不手工为id指定值的记录,id字段的值会是4 .
接下来使用替换成来写入一条记录:
xupeng@diggle7:3600 (dba_m), (dba), mysql>, REPLACE INTO auto (k, v), VALUES (1, 1); Query 好吧,,2,rows affected (0.01,秒) xupeng@diggle7:3600 (dba_m), (dba), mysql>, SELECT *,得到汽车; + - - - + - - - + - - - - - - - - - - - - - - - - - - + + | |,id k |, v ,,, |, extra , | + - - - + - - - + - - - - - - - - - - - - - - - - - - + + |,,2,|,2,|,2,,,,|,extra 2 | |,,3,|,3,|,3,,,,|,extra 3 | |,,4,|,1,|,1-1 , |, NULL ,, | null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null nullMySQL“取代into"的坑自增id、备机会有问题,这个问题在mysql5.7.17上是不会出现