2016-05-15 2 views
0

я пытаюсь написать запрос, который предотвращает вставив дублированные строки, как показано ниженаписание оракул запрос вставки, который предотвращает вставки продублированы на строки

INSERT INTO RSS_SETTING_ADMIN (ID_PRODUCT , ID_RSS , ID_CATEGORY , ID_TYPE_USER) 
VALUES (384 , 3, 283 , 1)WHERE NOT EXISTS 
(SELECT * FROM RSS_SETTING_ADMIN 
WHERE ID_PRODUCT = 384 , ID_RSS = 3 , ID_CATEGORY = 283, ID_TYPE_USER = 1) 

, но я получаю

SQL команды не правильно закончился

ошибка

+1

Загляните в инструкцию [MERGE] (http://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_9016.htm) – tbone

+1

Когда вы публикуете сообщения об ошибках, которые вы получаете, отправьте всю ошибку сообщение (включая строку и позицию). В этом случае сообщение об ошибке указывает непосредственно на проблему: слово «ГДЕ». Затем вы можете проверить документацию, вы обнаружите, что в инструкции INSERT с предложением VALUES нет места для предложения WHERE. https://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_9014.htm#i2111652 – mathguy

ответ

1

Ваша команда должна быть:

INSERT INTO RSS_SETTING_ADMIN (ID_PRODUCT , ID_RSS , ID_CATEGORY , ID_TYPE_USER) 
SELECT 384 , 3, 283 , 1 FROM DUAL 
WHERE NOT EXISTS 
(SELECT * FROM RSS_SETTING_ADMIN 
    WHERE ID_PRODUCT = 384 
     AND ID_RSS = 3 
     AND ID_CATEGORY = 283 
     AND ID_TYPE_USER = 1 
); 

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

0

Вы Shou Л.Д. изменить запрос к этому

INSERT INTO RSS_SETTING_ADMIN (ID_PRODUCT , ID_RSS , ID_CATEGORY , ID_TYPE_USER) 
select 384 , 3, 283 , 1 
from dual 
WHERE NOT EXISTS (SELECT * 
        FROM RSS_SETTING_ADMIN 
        WHERE ID_PRODUCT = 384 and ID_RSS = 3 
         and ID_CATEGORY = 283 and ID_TYPE_USER = 1 
       ); 
0

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

alter table RSS_SETTING_ADMIN 
    add constraint unq_RSS_SETTING_ADMIN_4 unique(id_product, id_rss, id_category, id_type_user); 

Это лучший подход, чтобы база данных поддерживать реляционную целостность, а не приложение.

Если вы хотите по-прежнему использовать not exists, я бы рекомендовал:

insert intoRSS_SETTING_ADMIN (ID_PRODUCT , ID_RSS , ID_CATEGORY , ID_TYPE_USER) 
    select x.id_product, x.id_rss, x.id_category, x.id_type_user 
    from (select 384 as id_product, 3 as id_rss, 283 as id_category, 1 as id_type_user 
      from dual 
     ) x 
    where not exists (select 1 
         from RSS_SETTING_ADMIN rsa 
         where rsa.id_product = x.id_product and 
          rsa.id_rss = x.id_rss and 
          rsa.id_category = x.id_category and 
          rsa.id_type_user = x.id_type_user 
        ); 

С этой структурой значения включаются только в запросе один раз, что делает его легче избежать опечаток.

Смежные вопросы