insert into A select m,n from B where not exists(select 1 from A where A.m=B.m)这样一条SQL语句,在多个连接同时执行时,有可能会有重复的记录吗?(指A表中m字段,有相同的值)我觉得应该有可能生成重复记录。谁比较清楚的帮忙给讲一下,谢谢!

解决方案 »

  1.   

    有个条件判断的阿。怎么会有重复记录。要有也是B表中存在重复记录。
    比如A表没有2,3
    而B表里有两条2,3
    这两条2,3都会被插入到A表中
      

  2.   

    有可能的 这里取决你的b表m值
    你后面的条件只是决定 a表和b表如果m值不等 那么会把b表的值插入到a表中
    但是 你不能保证b表中是否有重复的m值 所以是有可能重复的
      

  3.   


    SQL> select * from taba;         M          N
    ---------- ----------
             1       1.00
             2       2.03SQL> select * from tabb;         M          N P
    ---------- ---------- --------
             1       1.00 aaa
             2       1.23 bbbSQL> 
    SQL> insert into tabA a
      2    select m, n
      3      from tabB b
      4     where not exists (select 1 from tabA a where A.m = B.m);0 rows insertedSQL> --也就是说,如果A、B两表若建立以m字段为主关键字的话,肯定是不会重复的。
    --当然,其它记录有无相同与m字段无关。--如果A表中没有建立以m字段为主关键字的话,也许A表在未insert B表之前即可能存在重复,但这是允许的。SQL> insert into taba values(1,10.01);1 row insertedSQL> commit;Commit completeSQL> select * from taba;         M          N
    ---------- ----------
             1       1.00
             2       2.03
             1      10.01
      

  4.   

    谢谢各位的解答!我说的不是很清楚,也忘了说明一些条件:  A,B表的m字段之前都没有重复值,m字段也没有唯一约束
    一个连接在执行此条SQL的时候,在查询出结果,还没插入或者提交的时候,,,另一个连接也执行此SQL语句,查询的结果就会和之前一个连接的结果相同,然后两个连接都提交之后,就插入了相同的记录。应该会有这种情况吧?
      

  5.   

    如果A,B表的m字段之前都没有重复值的话,可以将m字段设为主键!
    这样的话,同表中永远不可能有重复的m记录。如果在建立主键的时候同表中有m的重复记录,先删掉重复的,再创建主键。
    LZ不用过度关心Oracle的并发问题。
      

  6.   


    你的
    “一个连接在执行此条SQL的时候,在查询出结果,还没插入或者提交的时候,,,另一个连接也执行此SQL语句,查询的结果就会和之前一个连接的结果相同,然后两个连接都提交之后,就插入了相同的记录。”
    矛盾点在:第一个连接在执行此条SQL的时候,在查询出结果,还没插入或者提交的时候,,,另一个连接也执行此SQL语句,查询的结果就会和之前一个连接的结果---不同---才对。“然后两个连接都提交之后,”应该是“‘最后’两个连接都提交之后”,重复记录是第二个连接执行SQL语句查询产生的。你把两次连接执行SQL语句分步提交就不会有重复记录了。
      

  7.   


    如果两个连接都还没提交的话,,,两个表的记录都没有变化,那查询语句 select m,n from B where not exists(select 1 from A where A.m=B.m)  应该是相同的结果吧?