ПК нарушается, когда я вставляю значения в таблицу - PullRequest
0 голосов
/ 14 ноября 2018

Я новичок в 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

Надеюсь, кто-нибудь может помочь мне узнать мою ошибку.

1 Ответ

0 голосов
/ 14 ноября 2018

Вы должны проверить, какие столбцы составляют индекс первичного ключа (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 (INSERT, UPDATE или DELETE). Поэтому избегайте SELECT * и укажите все столбцы. Это помогает избежать непредвиденных ошибок при изменении структуры таблицы.

Предполагая, что PCO_NUMBER является первичным ключом (измените предложение WHERE в операторе EXISTS, в зависимости от результатов вышеупомянутого), запрос должен быть следующим:

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