Как я могу сделать вставку, где не существует? - PullRequest
18 голосов
/ 16 января 2011

Я хотел бы объединить запрос вставки с «где не существует», чтобы не нарушать ограничения PK. Однако синтаксис, такой как следующий, дает мне ошибку Incorrect syntax near the keyword 'WHERE' -

INSERT INTO myTable(columns...)
VALUES(values...)
WHERE NOT EXISTS
   (SELECT *
    FROM myTable
    WHERE pk_part1 = value1,
        AND pk_part2 = value2)

Как мне это сделать?

(В общем, вы можете объединить вставку с предложением where?)

Ответы [ 4 ]

23 голосов
/ 16 января 2011
INSERT INTO myTable(columns...)
Select values...
WHERE NOT EXISTS
   (SELECT *
    FROM myTable
    WHERE pk_part1 = value1,
        AND pk_part2 = value2)

Edit: Прочитав ссылку на мартинс, если признаете, что лучшим решением является:

BEGIN TRY
    INSERT INTO myTable(columns...)
    values( values...)
END TRY
BEGIN CATCH
    IF ERROR_NUMBER() <> 2627
      RAISERROR etc
END CATCH;
3 голосов
/ 16 января 2011

Самый простой способ сохранить уникальный список значений - это либо а) установить столбец (столбцы) в качестве первичного ключа, либо б) создать уникальное ограничение на столбец (столбцы).Любое из этих действий может привести к ошибке при попытке вставить / обновить значения для чего-либо, уже существующего в таблице, когда NOT EXISTS / etc не будет выполнен тихо - нет ошибки, запрос будет выполнен правильно.

Тосказал, используйте INSERT / SELECT (не включайте часть VALUES):

INSERT INTO myTable(columns...)
SELECT [statically defined values...]
  FROM ANY_TABLE
 WHERE NOT EXISTS (SELECT NULL
                     FROM myTable
                    WHERE pk_part1 = value1
                      AND pk_part2 = value2)
0 голосов
/ 01 ноября 2018

Ни один из примеров не работал для меня ... поэтому я предлагаю этот пример:

INSERT INTO database_name.table_name(column_name)
SELECT column_name
  FROM database_name.table_name
 WHERE NOT EXISTS (SELECT NULL
                     FROM database_name.table_name
                    WHERE column_name = 'Column Value')
0 голосов
/ 16 января 2011

mysql имеет запрос игнорирования вставки:

Если вы используете ключевое слово IGNORE, ошибки, возникающие при выполнении оператора INSERT, вместо этого обрабатываются как предупреждения.Например, без IGNORE строка, которая дублирует существующий индекс UNIQUE или значение PRIMARY KEY в таблице, вызывает ошибку дубликата ключа, и оператор прерывается.С IGNORE строка все еще не вставлена, но ошибка не выдана.Преобразования данных, которые могут вызвать ошибки, прерывают оператор, если IGNORE не указан.С IGNORE недопустимые значения корректируются до ближайших значений и вставляются;выдаются предупреждения, но утверждение не прерывается.Вы можете определить с помощью функции API mysql_info () C, сколько строк было фактически вставлено в таблицу.

http://dev.mysql.com/doc/refman/5.0/en/insert.html

ON DUPLICATE KEY ОБНОВЛЕНИЕ также доступно

...