вставить запись, где не существует - PullRequest
0 голосов
/ 02 мая 2018
INSERT INTO CUST_ID_HISTORY(CUST_ID,PREVIOUS_CUST_ID,UPDATE_DATE) 
SELECT CUST_ID,PREVIOUS_CUST_ID,UPDATE_DATE
FROM CUST_ID_HISTORY WHERE NOT EXISTS (SELECT 1 FROM CUST_ID_HISTORY WHERE
CUST_ID='SCB301' AND PREVIOUS_CUST_ID='SCB201');

Выше запроса вставьте новую запись в CUST_ID_HISTORY, когда вставленное значение не существует в таблице. Я сталкиваюсь с ошибкой ORA-00001: unique constraint с предоставленным значением, но оба значения не существуют в таблице.

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Запрос:

INSERT INTO CUST_ID_HISTORY(CUST_ID,PREVIOUS_CUST_ID,UPDATE_DATE) 
SELECT CUST_ID,PREVIOUS_CUST_ID,UPDATE_DATE
FROM CUST_ID_HISTORY

будет дублировать все строки таблицы CUST_ID_HISTORY.

Добавление фильтра:

WHERE NOT EXISTS (
  SELECT 1
  FROM CUST_ID_HISTORY
  WHERE CUST_ID='SCB301' AND PREVIOUS_CUST_ID='SCB201'
);

Проверяет, существует ли существующая строка в таблице с CUST_ID='SCB301' AND PREVIOUS_CUST_ID='SCB201', если строка не существует, тогда все строки из таблицы CUST_ID_HISTORY будут продублированы и, если такая строка существует, тогда оператор вставит ноль строк.

Таким образом, ваш запрос либо продублирует все строк, либо ничего не сделает.

Если вы хотите вставить одну новую строку, проверяя, что она не существует, то:

INSERT INTO CUST_ID_HISTORY(CUST_ID,PREVIOUS_CUST_ID,UPDATE_DATE) 
SELECT 'SCB301',
       'SCB201',
       SYSDATE   -- The current date/time
FROM   DUAL
WHERE NOT EXISTS (
  SELECT 1
  FROM CUST_ID_HISTORY
  WHERE CUST_ID='SCB301' AND PREVIOUS_CUST_ID='SCB201'
);

или

MERGE INTO CUST_ID_HISTORY dst
USING (
  SELECT 'SCB301' AS CUST_ID,
         'SCB201' AS PREVIOUS_CUST_ID
  FROM   DUAL
) src
ON (   src.CUST_ID          = dst.CUST_ID
   AND src.PREVIOUS_CUST_ID = dst.PREVIOUS_CUST_ID )
WHEN NOT MATCHED THEN
  INSERT ( CUST_ID, PREVIOUS_CUST_ID, UPDATE_DATE ) 
  VALUES ( src.CUST_ID, src.PREVIOUS_CUST_ID, SYSDATE );

Который одновременно проверит, существует ли существующая строка, и вставит одну строку, если она не существует.

0 голосов
/ 02 мая 2018

Ваше утверждение выбирается из CUST_ID_HISTORY и вставляется в CUST_ID_HISTORY. Другими словами, когда нет записи для CUST_ID != 'SCB301' и PREVIOUS_CUST_ID != 'SCB201', он пытается создать дублирующую запись для каждой записи в CUST_ID_HISTORY . Предположительно, это первичный ключ таблицы, следовательно, нарушение уникального ключа ORA-00001.

Если то, что вы пытаетесь достичь, это вставить запись в CUST_ID_HISTORY для этих значений, возможно, вам нужен оператор слияния. Примерно так:

merge into CUST_ID_HISTORY tgt
using ( select 'SCB301' as id, 'SCB201' as prev_id
         from dual ) src
on ( src.id = tgt.cust_id 
      and src.prev_id = tgt.prev_cust_id)
when not matched then
    insert (cust_id, prev_cust_id, update_date)
    values (src.id, src.prev_id, sysdate)
/
...