`

replace into 和 insert into ON DUPLICATE KEY 用法

阅读更多

replace into 和 insert into ON DUPLICATE KEY 用法

 
-- 查询创建表语句
show create table person;
-- 创建person表,主键为int自增
CREATE TABLE `person` (
  `id` int(6) NOT NULL AUTO_INCREMENT,
  `name` varchar(32) DEFAULT NULL,
  `phone` varchar(32) DEFAULT NULL,
  `address` varchar(64) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- 新增测试数据
insert into person(name,phone,address) values ('张三','18812345678','浙江省杭州市');
insert into person(name,phone,address) values ('李四','18712345678','湖南省长沙市');
insert into person(name,phone,address) values ('王五','18612345678','江苏省南京市');
-- 查询数据
select * from person;

-- 执行replace into语句
replace into person(id,name,phone) values (1,'张三','18812345678') ;

-- 查询结果
select * from person;

-- 执行replace into语句
replace into person(id,name,phone,address) values (4,'赵六','18512345678','河北省石家庄市');

-- 查询结果
select * from person;

根据如上执行过程可以看出:
第一次的replace into语句,为更新id=1的数据,结果影响了2行,并且更新后address字段值内容为空。
第二次的replace into语句,为新增id=4的数据,结果影响了1行。
通过查询资料发现,若更新原有数据,replace into会先删除掉原有数据,此时结果影响1行,随后又新增该更新后的语句,结果又影响1行,由于values中未带有address字段值内容,所以更新后数据address字段值为空。
-- 执行insert into ON DUPLICATE KEY 语句
insert into person values (1,'张三','18888888888','浙江省杭州市') ON DUPLICATE KEY UPDATE address = '黑龙江省哈尔滨市'

-- 查询结果
select * from person;

-- 执行insert into ON DUPLICATE KEY 语句
insert into person values (5,'孙七','18412345678','内蒙古呼和浩特') ON DUPLICATE KEY UPDATE address = '黑龙江省哈尔滨市';

-- 查询结果
select * from person;

根据如上执行过程可以看出:
第一次的insert into ON DUPLICATE KEY UPDATE语句,为更新id=1的数据,结果影响了2行,并且更新后phone没有改变,address改变,说明执行更新的为update后面的字段。
第二次的insert into ON DUPLICATE KEY UPDATE语句,为新增id=5的数据,结果影响了1行,并且字段address为前者的“内蒙古呼和浩特”,并非update后面的字段值。
同replace into,先执行delete,后执行insert into,区别为,insert into ON DUPLICATE KEY UPDATE语句相当于执行的是if exist do update else do insert,因此,如果replace into填充的字段不全,则会导致未被更新的字段都会修改为默认值,insert into ON DUPLICATE KEY UPDATE语句只是更新部分字段,对于未被更新的字段不会变化。
所以:在相关应用场景中,如数据同步服务,尽量使用insert into ON DUPLICATE KEY UPDATE语句,保证不会造成数据字段丢失。
 
分类: 数据库

 

分享到:
评论

相关推荐

    MySQL的Replace into 与Insert into on duplicate key update真正的不同之处

    今天听同事介绍oracle到mysql的数据migration,他用了Insert into ..... on duplicate key update ...,我当时就想怎么不用Replace呢,于是回来就仔细查了下,它们果然还是有区别的

    mysql 中 replace into 与 insert into on duplicate key update 的用法和不同点实例分析

    主要介绍了mysql 中 replace into 与 insert into on duplicate key update 的用法和不同点,结合实例形式分析了replace into 与 insert into on duplicate key update的功能、基本用法与操作注意事项,需要的朋友可以...

    insert into … on duplicate key update / replace into 多行数据介绍

    当我插入一条数据时,我要判断(k1,k2)是否已经存在(1条selete),若存在就update,不存在就insert

    关于避免MySQL替换逻辑SQL的坑爹操作详解

    replace into和insert into on duplicate key 区别 replace的用法 当不冲突时相当于insert,其余列默认值 当key冲突时,自增列更新,replace冲突列,其余列默认值 Com_replace会加1 Innodb_rows_updated会加1 ...

    完美解决Thinkphp3.2中插入相同数据的问题

    在之前面对这样的问题的时候,我们知道,MySQL提供了ON DUPLICATE KEY UPDATE或者REPLACE INTO来解决。 使用ON DUPLICATE KEY UPDATE 插入数据之前,表中就一条记录,如下图 SQL语句如下,当插入记录时候,与表中...

    MySql三种避免重复插入数据的方法

    insert on duplicate key update insert ignore insert ignore 会忽视数据库中已经存在的数据,根据主键或者唯一索引判断,如果数据库没有数据,就会插入新的数据,如果有数据的话就跳过这条数据 小case 表结构 ...

    防止mysql重复插入记录的方法

    防止mysql重复插入记录的方法有很多种,常用的是ignore,Replace,ON DUPLICATE KEY UPDATE,当然我们也可以在php中加以判断了。 方案一:使用ignore关键字 如果是用主键primary或者唯一索引unique区分了记录的唯一性,...

    mysql如果数据不存在,则插入新数据,否则更新的实现方法

    //如果不存在,则插入新数据 $sql = “INSERT INTO {$ecs->table...desc’]}’) ON DUPLICATE KEY UPDATE cat_name='{$val[\u2018cat_name\u2019]}\u2019,cat_desc='{$val[‘cat_desc’]}’,keywords='{$val[‘cat_desc

    UE(官方下载)

    You can use these functions to insert a file into the active file, insert a string into the file at every specified increment, sample colors from anywhere on your screen, and more. Using Bookmarks ...

    BobBuilder_app

    NoSQL: A grass roots movement to replace relational databases with more relevant and specialized storage systems to the application in question. These systems are usually designed for performance. ...

    simple-tags

    1. Unzip "Simple tags" archive and put all files into a folder like "/wp-content/plugins/simple-tags/" 2. Activate the plugin through the 'Plugins' menu in WordPress 3. Inside the Wordpress admin, go ...

    flash shiti

    19.Flash插入(Insert)菜单中,Key Frame表示? A. 删除当前帧或选定的帧序列 B. 在时间线上插入一个新的关键帧 C. 在时间线上插入一个新的空白关键帧 D. 清楚当前位置上或选定的关键在时间线上插入一个新的...

Global site tag (gtag.js) - Google Analytics