MySQL中replace into 、insert into 、insert ignore into

一、MySQL中replace into 、insert into 、insert ignore into 的区别

插入数据的表必须有主键或者是唯一索引!否则 replace into、insert ignore into、insert into 会直接插入数据,这将导致表中出现重复的数据。

-- replace into
   -- replace into 跟 insert 功能类似,不同点在于:
       1. replace into 首先尝试插入数据到表中,如果发现表中已经有此行数据(根据主键或者唯一索引判断)则先删除此行数据,然后插入新的数据;
       2. 否则没有此行数据的话,直接插入新数据。
 
-- insert into
      1. insert into 如果发现表中已经有此行数据(根据主键或者唯一索引判断)则会报"Duplicate entry 'xxx-yyy' for key 'PRIMARY'"错误;
      2. 否则没有此行数据的话,直接插入新数据。
 
-- insert ignore into 
      1. 如果发现表中已经有此行数据(根据主键或者唯一索引判断)则跳过此查询,不对数据库作任何操作;

二、MySQL的Replace into 与Insert into on duplicate key update

(1),没有key的时候,replace与insert .. on deplicate udpate相同。
(2),有key的时候,都保留主键值,并且auto_increment自动+1
不同之处:有key的时候,replace是delete老记录,而录入新的记录,所以原有的所有记录会被清除,这个时候,如果replace语句的字段不全的话,有些原有的比如例子中c字段的值会被自动填充为默认值。
      而insert .. deplicate update则只执行update标记之后的sql,从表象上来看相当于一个简单的update语句。
      但是实际上,根据我推测,如果是简单的update语句,auto_increment不会+1,应该也是先delete,再insert的操作,只是在insert的过程中保留除update后面字段以外的所有字段的值。

 所以两者的区别只有一个,insert .. on deplicate udpate保留了所有字段的旧值,再覆盖然后一起insert进去,而replace没有保留旧值,直接删除再insert新值。
 从底层执行效率上来讲,replace要比insert .. on deplicate update效率要高,但是在写replace的时候,字段要写全,防止老的字段数据被删除。

三、mysql慢查询

# General and Slow logging.
log-output=FILE
general-log=0
general_log_file= "D:/Visual-NMP-x64/logs/MySQL/general.log"
slow-query-log=1
slow_query_log_file= "D:/Visual-NMP-x64/logs/MySQL/slow_query.log"
long_query_time=1
#没有使用使用索引写入慢查询日志
log-queries-not-using-indexes = OFF 
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值