insert into A select m,n from B where not exists(select 1 from A where A.m=B.m)这样一条SQL语句,在多个连接同时执行时,有可能会有重复的记录吗?(指A表中m字段,有相同的值)我觉得应该有可能生成重复记录。谁比较清楚的帮忙给讲一下,谢谢!
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
比如A表没有2,3
而B表里有两条2,3
这两条2,3都会被插入到A表中
你后面的条件只是决定 a表和b表如果m值不等 那么会把b表的值插入到a表中
但是 你不能保证b表中是否有重复的m值 所以是有可能重复的
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
一个连接在执行此条SQL的时候,在查询出结果,还没插入或者提交的时候,,,另一个连接也执行此SQL语句,查询的结果就会和之前一个连接的结果相同,然后两个连接都提交之后,就插入了相同的记录。应该会有这种情况吧?
这样的话,同表中永远不可能有重复的m记录。如果在建立主键的时候同表中有m的重复记录,先删掉重复的,再创建主键。
LZ不用过度关心Oracle的并发问题。
你的
“一个连接在执行此条SQL的时候,在查询出结果,还没插入或者提交的时候,,,另一个连接也执行此SQL语句,查询的结果就会和之前一个连接的结果相同,然后两个连接都提交之后,就插入了相同的记录。”
矛盾点在:第一个连接在执行此条SQL的时候,在查询出结果,还没插入或者提交的时候,,,另一个连接也执行此SQL语句,查询的结果就会和之前一个连接的结果---不同---才对。“然后两个连接都提交之后,”应该是“‘最后’两个连接都提交之后”,重复记录是第二个连接执行SQL语句查询产生的。你把两次连接执行SQL语句分步提交就不会有重复记录了。
如果两个连接都还没提交的话,,,两个表的记录都没有变化,那查询语句 select m,n from B where not exists(select 1 from A where A.m=B.m) 应该是相同的结果吧?