php和Mysql使用insert on duplicate分析

 Mysql replace 与 insert on duplicate效率分析:http://blog.csdn.net/jiangying09/article/details/47418439


一、首先简单讲一下replace的语法特征:

1、replace语法:

REPLACE  INTO user_info (`name`, `sex`, `birthday`)
VALUES ('张三', '1', '1997-01-06')

2、replace规则:如果数据已存在,删除该数据,重新插入一条新的数据


二、虽然insert on duplicate效率 高,但也有他自身的问题,在应用的过程中发现,insert on duplicate使用的效果跟表的引擎有关,下面分别说明:


1、表引擎是MyISAM

a、直接在数据库管理器运行sql语句,如(对数据做修改):

INSERT INTO user_info (`name`, `sex`, `birthday`)
VALUES
  ('张三', '1', '1997-01-06')
  ON DUPLICATE KEY
  UPDATE
    `name` = VALUES (NAME),
    `sex` = VALUES (sex),
    `birthday` = VALUES (birthday)

结果:表的自动增量和张三那条数据的主键id都没有发生变化

b、在php代码里运行sql语句,如(对数据做修改):

INSERT INTO user_info (`name`, `sex`, `birthday`)
VALUES
  ('张三', '1', '2000-01-06')
  ON DUPLICATE KEY
  UPDATE
    `name` = VALUES (NAME),
    `sex` = VALUES (sex),
    `birthday` = VALUES (birthday)

结果:表的自动增量和张三那条数据的主键id都没有发生变化

小结:这种情况就相当于是查询了数据是否存在,如果存在就update,如果不存在就insert

2、修改表引擎为InnoDB

a、直接在数据库管理器运行sql语句,如(对数据做修改):

INSERT INTO user_info (`name`, `sex`, `birthday`)
VALUES
  ('张三', '1', '1998-01-06')
  ON DUPLICATE KEY
  UPDATE
    `name` = VALUES (NAME),
    `sex` = VALUES (sex),
    `birthday` = VALUES (birthday)

结果:表的自动增量+1了,变成了3,张三那条数据的主键id则没有发生变化

b、在php代码里运行sql语句,如:

INSERT INTO user_info (`name`, `sex`, `birthday`)
VALUES
  ('张三', '1', '1996-01-06')
  ON DUPLICATE KEY
  UPDATE
    `name` = VALUES (NAME),
    `sex` = VALUES (sex),
    `birthday` = VALUES (birthday)

结果:表的自动增量+1了,变成了3,张三那条数据的主键id也发生了变化,变成了2,此时相当于是replace的操作效果,删除了id是1的数据,重新插入了一条id是2的数据

小结:这种情况比较复杂,建议最好不要使用,a的情况,自动增量+1了,但原数据的id并没有变。如果用在服务器的主从中,会是个隐患


总结:insert on duplicate在表引擎不同的时候,执行后得出的数据是不同的,表引擎是MyISAM时,如果有数据存在,只对数据做修改,这个是我们想要的,可以减少主键维护的成本。但如果表引擎是InnoDB时,结果又是会有区别的,建议在这种情况下不要使用insert on duplicate。


附:示例表信息:

背景:表user_info:结构

CREATE TABLE `user_info` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(25) NOT NULL COMMENT '姓名',
  `sex` tinyint(1) NOT NULL COMMENT '性别:1男2女',
  `birthday` date NOT NULL COMMENT '出生日期',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8


数据:

此时的表增量是2:




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值