![](/img/trans.png)
[英]how to alter primary key to set Default value DEFAULT SYS_GUID() in ORACLE
[英]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.