我想定期从表A往表B中插入数据,插入数据时根据表B中的主键字段判断该部分数据是否已经存在,在插入时只插不存在的数据。
现在需要参考的两种方式:
(1)、INSERT INTO B (字段列表) SELECT 字段列表 FROM A WHERE 主键组合 NOT IN (SELECT 主键组合 FROM B); 
这种方式效率很低下,速度非常慢。
(2)、INSERT INTO B (字段列表) SELECT 字段列表 FROM A MINUS SELECT 字段列表 FROM B;                   
速度比较快,但是如果主键一样而后边字段不一样的时候就不正确了。对于这个问题,大家有什么比较好的办法?

解决方案 »

  1.   

    就不管重复不重复,直接插入。如果出错就在错误处理中rollback,不出错就COMMIT,这样会快一些吧?
      

  2.   

    你这会有一个unique constraint
      

  3.   

     in 速度相对来说比较慢.. in 要排序的吧
     用exists 
      

  4.   

    应用程序中判断, 在插入前先select count(*), 存在冲突的记录就不要执行插入语句.
      

  5.   

    谢谢大家了,就用not exists这种方式吧,我试了一下,速度还可以。
      

  6.   

    楼主,not exists怎么用的啊?
    我现在也碰到了相同的问题:
    OracleCommand cmd = new OracleCommand(
    "INSERT INTO PMS_LOG (text,abstract,filelocation,time) VALUES(:text,:abstract,:filelocation,:time)",thisConnection);cmd.Parameters.Add("text", OracleType.VarChar, 1000, "text");
    cmd.Parameters.Add("abstract", OracleType.VarChar, 50, "abstract");
    cmd.Parameters.Add("filelocation", OracleType.VarChar, 100, "filelocation");
    cmd.Parameters.Add("time", OracleType.Timestamp, 6, "time");
    thisadapter.InsertCommand = cmd;
    thisadapter.Update(thisDataSet, "PMS_LOG");现在可以插入数据,但是我数据库设置了text和abstract作为主键。现在该如何在插入语句中使用not exists?
    拜托了!