我在將某個表中的數據批量插入新表時遇到一些問題。目標有點是這樣的:INSERT INTO/SELECT DISTINCT導致SYS_GUID的主鍵衝突
CREATE TABLE TEST_T (
T_GUID RAW(16) DEFAULT SYS_GUID() NOT NULL,
T_VAL1 NUMBER(10) NOT NULL,
T_VAL2 VARCHAR2(10) NOT NULL,
PRIMARY KEY (T_GUID)
)
語句的簡化版本,我打算用數據來填充:
INSERT INTO TEST_T (T_VAL1, T_VAL2)
SELECT DISTINCT
CAST(SUBSTR(zip_code, 1,1) AS NUMBER) as t_val1,
zip_code as t_val2
FROM OTHER_TABLE_T
WHERE ...
ORDER BY t_val1
因爲我沒有提供一個T_GUID
看重的,我會一直假定我會得到一個由SYS_GUID
函數爲每個新行提供的函數。但是出了問題,我得到了主鍵的唯一性約束違規。
如果我刪除DISTINCT
,語句成功,但我得到大量重複條目。當然,如果我在我的SELECT
中明確提供SYS_GUID()
呼叫,那麼結果完全相同。
現在我發現,如果我只是把另一SELECT
圍繞礦山,它的作品了好了,不違反約束和不同行得到插入:
INSERT INTO ...
SELECT x.* FROM (
SELECT DISTINCT ...
) x
所以,你在哪裏的重複的GUID從何而來?如果整行行沒有問題,爲什麼要通過不同的原因排除行?由於SYS_GUID爲每個調用創建一個唯一的標識符,我只能想象,在不同的情況下,它只會被整個子句調用一次,這由周圍的包裝SELECT
解決。如果有人能夠解釋這種情況下的執行情況如何,我會非常高興。
確定的GUID是重複?仔細看看它們,它們看起來很相似,但你應該注意到它們每個都至少有一個不同的字符。 – GriffeyDog 2013-05-13 16:00:31
您的代碼看起來正確。您可能會碰到一個Oracle錯誤,請查看「在My Oracle Support上,在AIX上生成的DUPLICATE SYS_GUID可能導致排隊期間發生ORA-1錯誤[ID 1371805.1]」。 – 2013-05-13 18:33:46