0

已解决: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)

我得到:

  1. 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 
);
4

0 回答 0