show create table person;
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 person(id,name,phone) values (1,'张三','18812345678') ;
select * from person;
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 person values (1,'张三','18888888888','浙江省杭州市') ON DUPLICATE KEY UPDATE address = '黑龙江省哈尔滨市'
select * from person;
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语句,保证不会造成数据字段丢失。
相关推荐
今天听同事介绍oracle到mysql的数据migration,他用了Insert into ..... on duplicate key update ...,我当时就想怎么不用Replace呢,于是回来就仔细查了下,它们果然还是有区别的
主要介绍了mysql 中 replace into 与 insert into on duplicate key update 的用法和不同点,结合实例形式分析了replace into 与 insert into on duplicate key update的功能、基本用法与操作注意事项,需要的朋友可以...
当我插入一条数据时,我要判断(k1,k2)是否已经存在(1条selete),若存在就update,不存在就insert
replace into和insert into on duplicate key 区别 replace的用法 当不冲突时相当于insert,其余列默认值 当key冲突时,自增列更新,replace冲突列,其余列默认值 Com_replace会加1 Innodb_rows_updated会加1 ...
在之前面对这样的问题的时候,我们知道,MySQL提供了ON DUPLICATE KEY UPDATE或者REPLACE INTO来解决。 使用ON DUPLICATE KEY UPDATE 插入数据之前,表中就一条记录,如下图 SQL语句如下,当插入记录时候,与表中...
insert on duplicate key update insert ignore insert ignore 会忽视数据库中已经存在的数据,根据主键或者唯一索引判断,如果数据库没有数据,就会插入新的数据,如果有数据的话就跳过这条数据 小case 表结构 ...
防止mysql重复插入记录的方法有很多种,常用的是ignore,Replace,ON DUPLICATE KEY UPDATE,当然我们也可以在php中加以判断了。 方案一:使用ignore关键字 如果是用主键primary或者唯一索引unique区分了记录的唯一性,...
//如果不存在,则插入新数据 $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
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 ...
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. ...
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 ...
19.Flash插入(Insert)菜单中,Key Frame表示? A. 删除当前帧或选定的帧序列 B. 在时间线上插入一个新的关键帧 C. 在时间线上插入一个新的空白关键帧 D. 清楚当前位置上或选定的关键在时间线上插入一个新的...