Условный INSERT с SQL?

У меня есть база данных, которая время от времени обновляется наборами данных. Здесь может случиться, что набор данных доставлен, который уже существует в базе данных.

В настоящее время я сначала делаю

SELECT FROM ... WHERE val1=... AND val2=...

проверить, если набор данных с этими данными уже существует (используя данные в инструкции WHERE). Если это не возвращает никакого значения, я делаю свой INSERT.

Но для меня это немного сложно. Итак, мой вопрос: есть ли какой-то условный INSERT, который добавляет новый набор данных только в том случае, если он не существует?

Я использую SmallSQL

Ответы

Ответ 1

Вы можете сделать это с помощью одного оператора и подзапроса почти во всех реляционных базах данных.

INSERT INTO targetTable(field1) 
SELECT field1
FROM myTable
WHERE NOT(field1 IN (SELECT field1 FROM targetTable))

Некоторые реляционные базы данных имеют улучшенный синтаксис для вышеупомянутого, поскольку то, что вы описываете, является довольно общей задачей. SQL Server имеет синтаксис MERGE со всеми параметрами, а MySQL имеет необязательный синтаксис INSERT OR IGNORE.

Изменить: Документация SmallSQL довольно скудна относительно того, какие части стандарта SQL он реализует. Он может не выполнять подзапросы, и поэтому вы не сможете следовать приведенному выше совету или где-либо еще, если вам нужно придерживаться SmallSQL.

Ответ 2

Я не знаю о SmallSQL, но это работает для MSSQL:

IF EXISTS (SELECT * FROM Table1 WHERE Column1='SomeValue')
    UPDATE Table1 SET (...) WHERE Column1='SomeValue'
ELSE
    INSERT INTO Table1 VALUES (...)

На основе условия where это обновляет строку, если она существует, иначе она будет вставлять новую.

Я надеюсь, что вы искали.

Ответ 3

Это возможно при условии EXISTS. WHERE EXISTS проверяет наличие каких-либо записей в подзапросе. EXISTS возвращает true, если подзапрос возвращает одну или несколько записей. Вот пример

UPDATE  TABLE_NAME 
SET val1=arg1 , val2=arg2
WHERE NOT EXISTS
    (SELECT FROM TABLE_NAME WHERE val1=arg1 AND val2=arg2)

Ответ 5

Если вы хотите выполнить "upsert", один из наиболее эффективных способов в настоящее время в SQL Server для одиночных строк:

UPDATE myTable ...


IF @@ROWCOUNT=0
    INSERT INTO myTable ....

Вы также можете использовать синтаксис MERGE, если вы делаете это с наборами данных, а не с одиночными строками.

Если вы хотите INSERT, а не UPDATE, вы можете просто написать свой единственный оператор INSERT и использовать WHERE NOT EXISTS (SELECT ...)