Условный 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)
Ответ 4
Обычно вы делаете то, что не хотите дубликатов уникальных, и позволяете самой базе данных отказаться от вставки.
В противном случае вы можете использовать INSERT INTO, см. Как избежать дубликатов в запросе INSERT INTO SELECT в SQL Server?
Ответ 5
Если вы хотите выполнить "upsert", один из наиболее эффективных способов в настоящее время в SQL Server для одиночных строк:
UPDATE myTable ...
IF @@ROWCOUNT=0
INSERT INTO myTable ....
Вы также можете использовать синтаксис MERGE
, если вы делаете это с наборами данных, а не с одиночными строками.
Если вы хотите INSERT
, а не UPDATE
, вы можете просто написать свой единственный оператор INSERT
и использовать WHERE NOT EXISTS (SELECT ...)