已解决:USING 中的 SELECT 确实生成了重复的 s_main_obj_id。我认为它们必须是独一无二的(uuid,但是通过愚蠢的调整生成),但是当你消除了不可能的...... ;-)
使用 Oracle 11g(不是 R2),我想将源表 s 中的一些值合并到目标表 t 中。s 和 t 的 PK 都是字段 obj_id。
我用:
MERGE
INTO target_table t
USING (SELECT ... AS s_main_obj_id, ... AS s_p1,
... AS s_p2, ... AS s_typ FROM source_table) s
ON (t.p1 = s.s_p1
AND t.p2 = s.s_p2
AND t.typ = s.s_typ)
WHEN NOT MATCHED
THEN
INSERT (obj_id,
p1,
p2,
typ)
VALUES (s_main_obj_id,
s_p1,
s_p2,
s_typ)
我得到:
- 00000 - “违反了唯一约束 (%s.%s)”
*原因:UPDATE 或 INSERT 语句试图插入重复键。
约束的 ID 指向目标表的 obj_id。
USING中SELECT中生成的s_main_obj_id绝对是唯一的;我尝试使用 SELECT 并将结果与 PK obj_id 上的目标表连接:
SELECT * FROM (
SELECT ... AS s_main_obj_id, ... AS s_p1,
... AS s_p2, ... AS s_typ FROM source_table) s
JOIN target_table t
ON (t.obj_id = s.s_main_obj_id)
这给了我 0 个结果。
如果没有结果,MERGE 如何尝试插入重复键?
编辑:在目标表上,我有以下约束:
(错误提到了 SYS_C00138978 约束)
以及以下索引:
这是创建表语句:
CREATE TABLE TARGET_TABLE_NAME
(
OBJ_ID VARCHAR2(40 CHAR) NOT NULL
, TYP VARCHAR2(1 CHAR)
, P1 VARCHAR2(40 CHAR)
, P2 VARCHAR2(40 CHAR)
, CONSTRAINT SYS_C00138978 PRIMARY KEY
(
OBJ_ID
)
ENABLE
)
LOGGING
TABLESPACE "USERS"
PCTFREE 10
INITRANS 1
STORAGE
(
INITIAL 65536
NEXT 1048576
MINEXTENTS 1
MAXEXTENTS 2147483645
BUFFER_POOL DEFAULT
);
CREATE UNIQUE INDEX TARGET_TABLE_NAME_OBJ_ID ON TARGET_TABLE_NAME (OBJ_ID ASC)
LOGGING
TABLESPACE "USERS"
PCTFREE 10
INITRANS 2
STORAGE
(
INITIAL 65536
NEXT 1048576
MINEXTENTS 1
MAXEXTENTS 2147483645
BUFFER_POOL DEFAULT
);