使⽤MySqlreplaceinto(insertinto的增强版)时你不得不注意
的坑
使⽤MySql replace into(insert into 的增强版)时你不得不注意的坑
使⽤之前,你必须先搞懂它的原理,本⽂从以下⼏个⽅⾯介绍:replace into的应⽤场景;replace into的原理;replace into的应⽤注意事项,replace into的应⽤形式
(1) MySQL replace into 是insert into 的增强版本,它主要⽤于以下场景:
在向表中插⼊数据的时候,经常遇到这样的情况:1. ⾸先判断数据是否存在; 2. 如果不存在,则插⼊;3.如果存在,则更新。
在 SQL Server 中可以这样处理:
if not exists (select 1 from t where id = 1)
insert into t(id, update_time) values(1, getdate())
else
update t set update_time = getdate() where id = 1
那么 mysql 中如何实现这样的逻辑呢?别着急 mysql中有更简单的⽅法: replace into
replace into t(id, update_time) values(1, now());
replace into t(id, update_time) select 1, now();
(2)replace into原理
mysql删除重复的数据保留一条
replace into 跟 insert 功能类似,不同点在于:replace into ⾸先尝试插⼊数据到表中,
如果发现表中已经有此⾏数据(根据主键或者唯⼀索引判断)则先删除此⾏数据,然后插⼊新的数据。 2. 否则没有此⾏数据的话,直接插⼊新数据。
(3)replace into的应⽤注意事项
1)插⼊数据的表必须有主键或者是唯⼀索引!否则的话,replace into 会直接插⼊数据,这将导致表中出现重复的数据。
2)如果数据库⾥边有这条记录,则直接修改这条记录;如果没有则,则直接插⼊,在有外键的情况下,对主表进⾏这样操作时,因为如果主表存在⼀条记录,被从表所⽤时,直接使⽤replace into是会报错的,这和replace into的内部原理是相关(ps.它会先删除然后再插⼊)。
3)正确做法是- 即先删除该条存在的数据,然后再次插⼊这条数据,这和外键约束相悖呢,因此只能采⽤update和insert这样的组合,来应对外键约束
sql_select_1='''select * from one_and_two_stars where kn_id = %d ''' %( int(one_level_id))
res_num_1= ute_kg(sql_select_1)
if res_num_1 > 0:
# 修改该条记录
sql_update_one_and_two_stars='''update one_and_two_stars set  kn_name = %s, parent_kn_id = %s where kn_id = %s'''  ("'"+str(kn_name_1)+"'",
str(parent_kn_id_1), int(one_level_id))
sql_insert_one_and_two_stars= '''insert into one_and_two_stars(kn_id,kn_name,parent_kn_id,ctime)                                                  values('%s','%s','%s','%s')                                                  ''' % (str(one_level_id),  str(kn_name_1),str(parent_kn_id_1),str(dt))                ute_kg(sql_insert_one_and_two_stars)
selfmit_kg()
(4)replace into的使⽤形式
MySQL replace into 有三种形式:
1) replace into tbl_name(col_name, ...) values(...)
2) replace into tbl_name(col_name, ...) select ...
3) replace into tbl_name set col_name=value, ...
前两种形式⽤的多些。其中 “into” 关键字可以省略,不过最好加上 “into”,这样意思更加直观。另外,对于那些没有给予值的列,MySQL 将⾃动为这些列赋上默认值。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。