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>
由此可以證明還是由于傳入的數據有重復值導致的。
具體得在程序中繼續跟蹤,好讓他們心服口服。