SQL执行不存在则插入(Mysql,幂等)

一. SQL的幂等
  最近在执行软件升级过程中的数据库SQL的执行需要满足幂等性,即无论这些SQL执行了多少次,它们执行的结果是完全一致的。这里先提示一下有三种方法,唯一索引;NOT EXISTS;NOT IN;
二. 幂等SQL实现方法
  ①唯一索引
  唯一索引的方法是利用了数据库索引的特性,将不能重复的字段建立唯一索引,那么当你在执行SQL插入的记录会查询索引中这条记录是否存在,如果存在这条记录则该次不会被插入

# 假设first_name和second_name共同确定一个人,你需要先建立first_name和second_name的唯一索引
ALTER TABLE `Test` ADD UNIQUE (`first_name`,`second_name`);
# ignore会忽略数据库已存在该记录的warning
insert ignore into `Test`(first_name,second_name) values("aa","bb");

  ②NOT EXISTS
  如果不存在该记录,则插入该记录,这种写法最多一次插入一条记录。以下两张写法等同:

insert ignore into `Test` select 'aa' , 'cao' where not exists(select 1 from Test where `first_name`='aa' and `second_name`='bb');
insert ignore into `Test` select 'aa' , 'cao' from dual where not exists(select 1 from Test where `first_name`='aa' and `second_name`='bb');

  ③NOT IN
  可插入多条记录,大多数数据库是支持except关键字的,可以求差集,mysql不支持这个关键字,但是我们可以使用not in代替

# 将first_name=bb的second_name与first_name=aa的second_name做差集
INSERT IGNORE INTO `Test` (`first_name`, `second_name`) select `first_name`,`second_name` from `Test`
where `first_name`='aa' and `second_name` not in (select `second_name` from `Test` where `first_name`= 'bb');
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值