【问题标题】:PK violated When I insert values into a table当我将值插入表中时,违反了 PK
【发布时间】:2018-11-14 00:10:01
【问题描述】:

我是 SQL Oracle 的新手。我正在尝试“合并”两个表。

PAYMENT_COMMON ---> TABLE A
   (PCO_NUMBER(6,0) NOT NULL, 
    ID_BUILD NUMBER(5,0) NOT NULL, 
    NUM_DEPARMENT NUMBER(5,0) NOT NULL,
    PGC_DATE_CANCELATION DATE NOT NULL, 
    PGC_AMMOUNT_PAY NUMBER(10) NOT NULL,
    ID_VIA_PAYMENT NUMBER(2,0) NOT NULL);

还有一个名为 payment_common1 的表(与 payment_common 相同的行和列),其中有 111 个值不在 PAYMENT_COMMON 中。

所以我尝试使用查询添加这些值而不重复:

INSERT INTO PAYMENT_COMMON(PCO_NUMBER, 
    ID_BUILD NUMBER, 
    NUM_DEPARTMENT,
    PGC_DATE_CANCELATION, 
    PGC_AMMOUNT_PAY,
    ID_VIA_PAYMENT) 
    SELECT * FROM PAYMENT_COMMON
    UNION 
    SELECT * FROM PAYMENT_COMMON1;

但它会返回

ORA-00001: unique constraint (SYSTEM.PK_PAYMENT_COMMON) violated

希望有人能帮我找出我的错误。

【问题讨论】:

标签: sql oracle merge insert unique


【解决方案1】:

您应该检查构成主键索引 (PK_PAYMENT_COMMON) 的列。通过以下语句执行此操作:

SELECT cols.table_name, cols.column_name, cols.position, cons.status, cons.owner
FROM all_constraints cons, all_cons_columns cols
WHERE cols.table_name = 'PAYMENT_COMMON'
AND cons.constraint_type = 'P'
AND cons.constraint_name = cols.constraint_name
AND cons.owner = cols.owner
ORDER BY cols.table_name, cols.position;

但是您的INSERT 语句的主要问题是PAYMENT_COMMON 表中已经存在行,因此不需要再次插入它们。 此外,在执行 DML 语句(INSERTUPDATEDELETE)时,显式比隐式更好。因此,避免SELECT * 并指定所有列。如果表结构发生变化,这有助于避免意外错误。

假设PCO_NUMBER是主键(更改EXISTS语句中的WHERE子句,根据上面的结果),查询应该如下:

INSERT INTO PAYMENT_COMMON
(
    PCO_NUMBER, 
    ID_BUILD, 
    NUM_DEPARTMENT,
    PGC_DATE_CANCELATION, 
    PGC_AMMOUNT_PAY,
    ID_VIA_PAYMENT
) 
SELECT 
PCO_NUMBER, 
ID_BUILD, 
NUM_DEPARTMENT,
PGC_DATE_CANCELATION, 
PGC_AMMOUNT_PAY,
ID_VIA_PAYMENT
FROM PAYMENT_COMMON1 C1
WHERE NOT EXISTS (
                    SELECT 1
                    FROM PAYMENT_COMMON C
                    WHERE C.PCO_NUMBER = C1.PCO_NUMBER 
                 );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多