dumplicate mysql 技术_Mysql 插入更新 ON DUPLICATE KEY UPDATE

本文介绍了如何使用MySQL的ON DUPLICATE KEY UPDATE语句在数据表中进行插入或更新操作。通过创建唯一索引,当尝试插入的主键已存在时,系统会自动更新该记录。举例说明了在入库和出库场景下,如何利用此功能确保数据的完整性和一致性。
摘要由CSDN通过智能技术生成

Mysql 插入更新 ON DUPLICATE KEY UPDATE

发布时间:2018-03-12作者:laosun阅读(2354)

0f9e8264915948f7a1174b4a48c40c63.gif

我们想向数据库插入一条记录:若数据表中存在以相同主键的记录,我们就更新该条记录。否则就插入一条新的记录,那么这种操作使用 ON DUPLICATE KEY UPDATE 配合索引 即可解决!

向数据库插入一条记录:若数据表中存在以相同主键的记录,我们就更新该条记录。否则就插入一条新的记录。

我现在有一个需求,就是入库和出库。

那么现在有一个表格,模拟的是扫码枪扫描后的表格:

40e4fcdf2d76d884747020f8aedf1d54.png

入库进行扫码入库,或者扫码后的excel导出再导入自己的系统中,和进货批次匹配上,出库的时候同样的操作。这样就能追查到这个条形码从哪来,到哪去!

如果条形码是“一个”数据库表,建表语句如下CREATE TABLE `d_XXX`.`t_goods_bar_code`  (

`id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,

`logistics_id` int(11) NULL DEFAULT NULL COMMENT '进货物流id',

`order_address_id` int(11) NULL DEFAULT NULL COMMENT '订单物流id',

`goods_id` int(11) NOT NULL COMMENT '对应的商品id',

`bar_code` varchar(13) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '商品条形码',

`mfg_date` date NULL DEFAULT NULL COMMENT '生产日期',

`exp_date` date NULL DEFAULT NULL COMMENT '过期时间',

PRIMARY KEY (`id`) USING BTREE,

UNIQUE INDEX `bar_code`(`bar_code`) USING BTREE

) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

请看这个表的bar_code字段,这个就是储存条形码的字段,它是唯一索引。 我的入库条形码和出库条形码都是储存在这一个表中。

进货物流id就是入库,可以根据它查询到进货批次,进货人..... 相关联的表

订单物流id就是出库,可以根据它查询到订单号,购买人...等等

现在的问题就是:入库导入一次,出库还导入一次。而且还存在先导入出库,再导入入库的情况!总之一句话,数据别丢失

看解决办法:

如果先导入出库的条形码,sql如下

INSERT into t_goods_bar_code(bar_code,goods_id,order_address_id,mfg_date,exp_date)

values('1234583002851',10,1,now(),now()) ON DUPLICATE KEY UPDATE order_address_id=1;

执行上边的语句,会插入一条数据。

导入 入库的条形码

insert into t_goods_bar_code(bar_code,goods_id,logistics_id,mfg_date,exp_date)

values('1234583002851',10,2,now(),now()) ON DUPLICATE KEY UPDATE logistics_id=2;

执行上边的语句,会更新数据,把logistics_id更新成2。 这样就完成了操作,反过来也一样。

有的人会说了,程序控制也能解决,这句话没错,可是我的数据量非常大,需要batch批量提交。

其实我说这么多,就是想演示一下我的做法,模拟一样应用场景,更容易懂!

总结: 创建唯一索引,使用ON DUPLICATE KEY UPDATE

af499b9437efec8e1b25c2bb396e60d7.png

2 +1

版权声明

分享到:

发表评论

请文明留言

发表

共 0 条评论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值