Mysql 插入更新 ON DUPLICATE KEY UPDATE

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

Mysql

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

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

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

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

    扫码枪 excel


    入库进行扫码入库,或者扫码后的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

版权声明

 数据库  mysql

 请文明留言

0 条评论