mysql 高效insert 问题

前一时间,同事做记账,如果有记录就update ,没有记录就insert 他是用exist做判定。

结果跑了是140s  我后来用union 做了处理结果只有1s左右

视列如下

[code=SQL]

/* 数据表 库存帐*/

CREATE TABLE  InvBalAccount
(
  FiscalPeriod         char(2)               not null  /* 会计期间 */,
  WareHouseID          int                   not null  /* 仓库OID */,
  MaterialID           int                   not null  /* 货品ID */,
  DebQuanAmount        decimal(18,8)         default 0  not null  /* 借方数量发生 */,
  CredQuanAmount       decimal(18,8)         default 0  not null  /* 贷方数量发生 */,
  CurQuanBalance       decimal(18,8)         default 0  not null  /* 当前数量余额 */,
  BatchID              int                   default 0  not null  /* 批次ID */,
  PurchaseAmount       decimal(18,8)         default 0  not null  /* 采购在途数量*/,
  SalesAmount          decimal(18,8)         default 0  not null  /* 销售在途数量*/,
  InitOutQuantity      decimal(18,8)         default 0  not null  /* 期初出库数量*/,
  constraint InvBalAccount_Key_1 unique (FiscalPeriod, MaterialID, BatchID, WareHouseID) /* Key_1 */
)

/*建临时表*/
CREATE  TABLE IF NOT EXISTS T_InvValBalAccount(
  T_FiscalPeriod         char(2)               not null  /* 会计期间 */,
  T_WareHouseID          int                   not null  /* 仓库OID */,
  T_MaterialID           int                   not null  /* 货品ID */,
  T_QuanAmount        decimal(18,8)         default 0  not null  /* 贷方数量发生 */,
  T_ValueAmount       decimal(18,8)         default 0  not null  /* 贷方金额发生 */,
  T_BatchID              int                   default 0  not null  /* 批次ID */,
  T_onLoadAmount       decimal(18,8)         default 0  not null  /* 销售在途数量*/,
  OutType              char(1)               default '0' not null  /* 出库方式 0 不使用,1 先进先出 2 后进先出 3 人工选择 */
)
;

/*数据先汇到 T_InvValBalAccount表中,后两个表union 关联实现如下*/

  /*插入不存在的*/
  INSERT INTO InvBalAccount(FiscalPeriod,WareHouseID,MaterialID,BatchID,DebQuanAmount,CurQuanBalance,PurchaseAmount)
  SELECT FiscalPeriod,WareHouseID,MaterialID,BatchID,DebQuanAmount,DebQuanAmount,PurchaseAmount FROM (
  SELECT FiscalPeriod,WareHouseID,MaterialID,BatchID,DebQuanAmount,PurchaseAmount,sum(flag)FROM
  (SELECT FiscalPeriod,WareHouseID,MaterialID,BatchID,DebQuanAmount,PurchaseAmount,1 AS flag
  FROM InvBalAccount INNER JOIN T_invvalbalaccount ON
  InvBalAccount.FiscalPeriod=T_invvalbalaccount.T_FiscalPeriod
  AND InvBalAccount.WareHouseID=T_invvalbalaccount.T_WareHouseID
  AND InvBalAccount.MaterialID=T_invvalbalaccount.T_MaterialID
  AND InvBalAccount.BatchID=T_invvalbalaccount.T_BatchID
  UNION ALL
  SELECT T_FiscalPeriod,T_WareHouseID,T_MaterialID,T_BatchID,T_QuanAmount,T_onLoadAmount,0 AS flag
  FROM T_invvalbalaccount)aa
  GROUP BY FiscalPeriod,WareHouseID,MaterialID,BatchID
  HAVING sum(flag)=0)bb;

[/code]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值