Mysql 插入更新 ON DUPLICATE KEY UPDATE
发布时间:2018-03-12作者:laosun阅读(2354)
我们想向数据库插入一条记录:若数据表中存在以相同主键的记录,我们就更新该条记录。否则就插入一条新的记录,那么这种操作使用 ON DUPLICATE KEY UPDATE 配合索引 即可解决!
向数据库插入一条记录:若数据表中存在以相同主键的记录,我们就更新该条记录。否则就插入一条新的记录。
我现在有一个需求,就是入库和出库。
那么现在有一个表格,模拟的是扫码枪扫描后的表格:
入库进行扫码入库,或者扫码后的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
2 +1
版权声明
分享到:
发表评论
请文明留言
发表
共 0 条评论