MYSQL批量插入更新

插入更新,就是无则插入,有则更新
(一)目前以我的了解,mysql有两种方法实现。
这两种方式都是通过唯一索引来判断有无的,所以插入的语句中一定要包含有唯一索引的字段
1.replace into(不推荐)

-- id为主键
REPLACE INTO aa_mytest(id,i_name,i_value)
VALUES(1,'ass','123')

replace into 在遇到唯一索引时,会执行delete和insert,导致除了name,value之外的字段给改成null了,所以不推荐使用。

2.insert into on duplicate key update(推荐)

-- id为主键
INSERT INTO aa_mytest(id,name,value)
VALUES(1,'ass','123')
ON DUPLICATE KEY UPDATE 
name = VALUES(name),
value = VALUES(value)

insert into on duplicate key update在遇到唯一索引时,会执行update, 更新name和value,不会影响到其他字段。

(二)批量插入更新

REPLACE INTO aa_mytest(id,name,value)
VALUES(1,'ass','123'),(2,'asssd','1232'),(3,'asszz','123333')

INSERT INTO aa_mytest(id,name,value)
VALUES(1,'ass','123'),(2,'asssd','1232'),(3,'asszz','123333')
ON DUPLICATE KEY UPDATE 
name = VALUES(name),
value = VALUES(value)

(三)高级用法
下列sql是我在工作中真实用到的,结合了批量插入更新和把一个表数据同步到另一个表。
FLIGHT_ID为唯一索引,foc_flight新增6个字段,不改变其他数据的情况下把这6个字段补上

INSERT INTO foc_flight (
	FLIGHT_ID,
	OPEN_DOOR_TIME,
	BLOCK_OUT,
	ACARS_OUT,
	ACARS_INN,
	OUTT,
	INN,
	FLI_DATE,
	FLI_NUMBER,
	APT_ID_TAKE_OFF,
	APT_ID_LANDING,
	STD,
	MATCH_STATUS,
	id 
) SELECT 
	FLIGHT_ID,OPEN_DOOR_TIME,BLOCK_OUT,ACARS_OUT,ACARS_INN,OUTT,INN,
	NOW(),'test','1234','1234',NOW(),0,MD5(UUID())
FROM t2001
WHERE FLIGHT_ID IN (
SELECT
	ff.flight_id 
FROM
	der_certain_flight dcf
	LEFT JOIN foc_flight ff
	ON dcf.ID = ff.qar_flight_id
)
ON DUPLICATE KEY UPDATE 
OPEN_DOOR_TIME = VALUES(OPEN_DOOR_TIME),
ACARS_OUT = VALUES(ACARS_OUT),
ACARS_INN = VALUES(ACARS_INN),
OUTT = VALUES(OUTT),
INN = VALUES(INN),
BLOCK_OUT = VALUES(BLOCK_OUT);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值