2015-06-14 2 views
0

Я хочу вставить 5 новых строк в таблицу, если и только если ни одна из 5 строк не существует. Если один из них находится в таблице, я хочу прервать вставку (не обновляя ничего) и узнать, какой из них (или какие) уже есть.Прерывание вставки, если дубликат

я могу думать о длинных способов сделать это (например, смотрит, если SELECT col1 WHERE col1 IN (value1,value2,...) возвращает ничего, а затем вставлять только если это не)

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

С транзакциями или без них существует ли способ сделать это только в одном или двух запросах?

Благодаря

ответ

1

Я сомневаюсь, что есть лучший способ, чем решение вы упомянули: во-первых запустить SELECT запрос и, если он не возвращает ничего, INSERT. Вы просили что-то в одном или двух запросах. Это ровно два запроса, поэтому я считаю довольно эффективными. Я не могу придумать эффективный способ использования транзакций для этого. Сделки хороши, если у вас есть несколько запросов INSERT или UPDATE, у вас есть только один.

0

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

INSERT INTO FOO(col1) VALUES 
    (val1), 
    (val2), 
    (val3), 
    (val4), 
    (val5); 

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

INSERT INTO FOO(col1) VALUES 
    Seleect a.* from (Select val1 
     union 
    Select val2 
     union 
    select val3 
     union 
    select val4 
     union 
    select val5) a 
    inner join 
    (select g.* from( 
     select false b from foo where col1 in(val1,val2....) 
     union 
     select true) g 
    limit 1) b on b.b 

Что случилось? самый внутренний запрос возвращает true, только если нет значений, поэтому он будет вставлять все значения только в том случае, если значений нет.

+1

OP хочет знать, какой из них (или какие) уже были там, если таковые имеются. –

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