Почему при вставке нарушается это уникальное ограничение? - PullRequest
3 голосов
/ 22 ноября 2011

Я вставляю данные в таблицу, выбирая из другой таблицы, которая может иметь дубликаты.Я думал, что мой запрос обрабатывает это, проверяя, существует ли строка, но я получаю уникальное нарушение ограничения.

Вот запрос:

INSERT INTO FOLDER_USER (FOLDER_ID, USER_ID) 
    SELECT DECODE(FOLDERID,'F10', '1','F565','2','F11', '3','F81', '4','0'), USERID
    FROM DATA1.FOLDERS F1
    WHERE UPPER(OWNER) = 'ADMIN'
    AND NOT EXISTS 
        (SELECT 1 FROM FOLDER_USER F2  
         WHERE DECODE(FOLDERID,'F10', '1','F565','2','F11', '3','F81', '4','0')= F2.FOLDER_ID 
         AND F1.USERID = F2.USER_ID);
  • Таблица FOLDER_USER содержит 2столбцы FOLDER_ID (число), USER_ID (varchar) и вместе они составляют первичный ключ
  • Таблица FOLDERS содержит 2 столбца FOLDERID и USERID (оба varchars).Значение в FOLDERID необходимо декодировать в число в зависимости от его значения перед вставкой в ​​новую таблицу

Ответы [ 2 ]

3 голосов
/ 22 ноября 2011

Причиной может быть неправильное представление о том, как выполняется такая SQL-инструкция.

Сначала выберите все строки. А затем вставляет их все в таблицу. Это означает, что ваше предложение существует не видит строки, вставленные ранее теми же операторами

При взгляде на утверждение у вас может сложиться впечатление, что он вставляет строку, а затем выбирает следующую в цикле, как в моде. Это не тот случай.

2 голосов
/ 22 ноября 2011

Возможно, выбранные вами строки не являются уникальными внутри себя.

Попробуйте:

INSERT INTO folder_user( folder_id,
                         user_id)
   SELECT UNIQUE 
          DECODE( folderid,  'F10', '1',  'F565', '2',  'F11', '3',  'F81', '4',  '0' ),
          userid
     FROM data1.folders f1
    WHERE UPPER( owner ) = 'ADMIN'
          AND NOT EXISTS
                 (SELECT 1
                    FROM folder_user f2
                   WHERE DECODE( folderid,  'F10', '1',  'F565', '2',  'F11', '3',  'F81', '4',  '0' ) = f2.folder_id
                         AND f1.userid = f2.user_id);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...