发布时间:2018-03-12作者:laosun阅读(3494)
我们想向数据库插入一条记录:若数据表中存在以相同主键的记录,我们就更新该条记录。否则就插入一条新的记录,那么这种操作使用 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
版权属于: 技术客
原文地址: https://www.sunjs.com/article/detail/3de920ca8369492d804ab89d133ccd80.html
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。