您的位置:首页 > 编程语言 > PHP开发

php和Mysql使用insert on duplicate分析

2015-08-11 15:08 621 查看
 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:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  php mysql