问题是这样的:
在MySQL中向一个表中插入新记录,每次插入的时候必须保证插入的记录不能是重复的。即如果这条记录的所有字段的值都和表中已经存在的一条记录完全相同,则不能插入。常规的做法是每次插入的时候遍历查询整个表,如果没有完全相同的记录就把这条记录插进去,但是这么做好像效率太低了!有没有什么好的方法可以解决这个问题!!请高人指点!!谢谢!

解决方案 »

  1.   

    这已经是最常规的方法了。
    如果有主键,则可以直接通过错误信息判断。如果SQL返加错误,直接跳过就行了。
      

  2.   

    如果用MYSQL,参考REPLACE命令REPLACE works exactly like INSERT, except that if an old row in the table has the same value as a new row for a PRIMARY KEY or a UNIQUE index, the old row is deleted before the new row is inserted
      

  3.   

    不知是不是我写的这个问题
    http://blog.csdn.net/net_flyfox/archive/2009/03/11/3980731.aspx
    /* 数据表 库存帐*/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;