簡體   English   中英

INSERT INTO / SELECT DISTINCT導致SYS_GUID的主鍵沖突

[英]INSERT INTO / SELECT DISTINCT results in primary key violation for a 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函數提供的SYS_GUID 但是出了點問題,我得到了主鍵的唯一性約束違規。

如果我刪除了DISTINCT ,語句會成功,但是我會得到很多重復的條目。 當然,如果我在SELECT明確提供SYS_GUID()調用,那么結果完全相同。

現在我發現,如果我只是在我的周圍添加另一個SELECT ,它就可以正常工作,沒有違反約束並且插入了不同的行:

INSERT INTO ...
SELECT x.* FROM (
    SELECT DISTINCT ...
) x

那么重復的guids來自哪里? 如果完整的行集沒有問題,為什么通過不同的方法刪除行會造成麻煩? 由於SYS_GUID為每個調用創建一個唯一的標識符,我只能想象在不同的​​情況下,它只被整個子句調用一次,這是由周圍的包裝SELECT解決的。 如果有人可以解釋在這種情況下執行的不同,我會很高興。

嘗試這樣的事情:

insert into test_t(t_guid, t_val1, t_val2)
  select sys_guid(), t_val1, t_val2
    from (select distinct to_number(substr(zip_code, 1, 1)) as t_val1, zip_code as t_val2
            from other_table_t
           where ...)

用to_number()替換CAST並添加guid。 先測試你的選擇,然后插入...:

SELECT DISTINCT
    sys_guid() guid 
    To_Number(SUBSTR(zip_code, 1,1)) as  t_val1,
    zip_code as t_val2
 FROM OTHER_TABLE_T
/

不同的GUID示例:

SELECT sys_guid() gid, deptno
  FROM
 (
 SELECT distinct deptno FROM scott.emp
 )
ORDER BY deptno
/

GID                                 DEPTNO
-------------------------------------------
DC9B9132492C1A45E04011AC3EEB463A    10
DC9B9132492B1A45E04011AC3EEB463A    20
DC9B9132492A1A45E04011AC3EEB463A    30

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM