欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

into插入數據出現主鍵沖突

林玟書2年前12瀏覽0評論

into插入數據出現主鍵沖突?

在后臺中開發了一個存儲過程用到merge into,主要是根據主鍵值來查看目標表中是否有該主鍵值,如果有進行更新,否則插入,然而在測試過程中經常出現ORA-00001 主鍵沖突。

前端開發人員口口聲聲說傳入的數據不會有重復值,懷疑數據庫的問題。我相信Oracle不會有這樣的bug。

索性我在后臺演示出現該錯誤的方法。

1、創建測試表

create table T_TEST

(

A CHAR(1),

B NUMBER

)

2、創建測試存儲過程

create or replace procedure test(i_num in number) is

begin

MERGE INTO t_test t

USING (SELECT '1' a, ROWNUM b FROM DUAL CONNECT BY ROWNUM <= i_num) TA

ON (t.a = TA.a)

WHEN MATCHED THEN

UPDATE SET T.b = t.b + TA.b

WHEN NOT MATCHED THEN

INSERT VALUES (TA.a, TA.b);

commit;

end test;

3、執行存儲過程test

SQL> exec test(12);

PL/SQL procedure successfully completed

SQL> select * from t_test;

A B

- ----------

1 12

1 11

1 10

1 9

1 8

1 7

1 6

1 5

1 4

1 3

1 2

1 1

12 rows selected

SQL>

4、清空t_test

SQL> truncate table t_test;

Table truncated

SQL>

5、添加主鍵

SQL> ALTER TABLE T_TEST ADD CONSTRAINT PK_T_TEST PRIMARY KEY (A) USING INDEX;

Table altered

6、在t_test中添加一行數據

SQL> exec test(1);

PL/SQL procedure successfully completed

SQL> select * from t_test;

A B

- ----------

1 1

7、此時嘗試再次添加多行數據,此時會出現錯誤ORA-30926,原因是在Using選項后面中a有多個重復值

SQL> exec test(10);

begin test(10); end;

ORA-30926: 無法在源表中獲得一組穩定的行

ORA-06512: 在 "TEST.TEST", line 3

ORA-06512: 在 line 1

SQL>

8、清空t_test

SQL> truncate table t_test;

Table truncated

9、嘗試添加多行a值相同的數據,提示主鍵沖突

SQL> exec test(10);

begin test(10); end;

ORA-00001: 違反唯一約束條件 (TEST.PK_T_TEST)

ORA-06512: 在 "TEST.TEST", line 3

ORA-06512: 在 line 1

SQL>

由此可以證明還是由于傳入的數據有重復值導致的。

具體得在程序中繼續跟蹤,好讓他們心服口服。