mysql中ON DUPLICATE KEY UPDATE和REPLACE INTO用法

本文介绍在MySQL中处理主键冲突时的两种方法:ON DUPLICATE KEY UPDATE与REPLACE INTO。通过示例代码演示如何在主键已存在时,选择进行更新或先删除后插入,确保数据完整性和一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景:在向数据库中插入语句,尤其是插入的字段包含了主键或者唯一索引时。总是需要先判断要插入的该主键或唯一索引字段值在数据表中是否已经存在,之后还需要依据判断的结果决定是进行添加操作还是修改操作。今天无意发现mysql可以将这个简化的用法,找了些资料,调试完成后将经验总结下。

实现方式有:

1.ON DUPLICATE KEY UPDATE   原理:在确定主键值已经存在后,会进行update修改操作。(可以指定修改的字段,这样可以不影响其他字段的值)

2.REPLACE INTO  原理:在确定主键值已经存在后,会先进行delete删除操作,再进行insert添加操作。(因为是先删除后添加,所以会影响其他字段的值。如果添加的字段值包含了所有的列,可以用这种方式,其他不推荐,会导致数据错误)


上代码部分:

1.REPLACE INTO 

REPLACE INTO ecm_goods_status(goods_id,if_stock,stock_price) values(3264604,1,25)


红色框区域的值已经丢失

2.ON DUPLICATE KEY UPDATE 


INSERT INTO ecm_goods_status(goods_id,if_stock,stock_price) VALUES(3264604,1,15)
ON DUPLICATE KEY UPDATE if_stock=1,stock_price=VALUES(stock_price)

完成需要的操作,并且红色框区域的数据没有丢失

3.ON DUPLICATE KEY UPDATE 多行多列操作(VALUES函数为获取对应列值)

INSERT INTO ecm_goods_status(goods_id,if_stock,stock_price) VALUES(3264427,1,50.00),(3264430,1,2.00),(3264604,1,8.00) ON DUPLICATE KEY UPDATE if_stock=1,stock_price=VALUES(stock_price)
4.ON DUPLICATE KEY UPDATE 直接使用查询结果(别名字段不能使用,会导致mysql报识别不了列名的错误)
INSERT INTO ecm_goods_status(goods_id,if_stock,stock_price)
	select goods_id,1 as if_stock,pro_special_price
	from ecm_market_activity_apply 
	where goods_id > 0 
	and ma_type= 21
	and status=2
ON DUPLICATE KEY UPDATE if_stock=1,stock_price=pro_special_price

列别名报错的情况

INSERT INTO ecm_goods_status(goods_id,if_stock,stock_price)
	select goods_id,1 as if_stock,min(pro_special_price) as price
	from ecm_market_activity_apply 
	where goods_id > 0 
	and ma_type= 21
	and status=2
	GROUP BY goods_id
ON DUPLICATE KEY UPDATE if_stock=1,stock_price=price




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值