我有一个不时使用数据集更新的数据库。在这里,可能会交付已存在于数据库中的数据集。
目前我首先做一个
SELECT FROM ... WHERE val1=... AND val2=...
检查是否已经存在包含这些数据的数据集(使用 WHERE 语句中的数据)。如果这没有返回任何值,我正在做我的 INSERT。
但这对我来说似乎有点复杂。所以我的问题是:是否有某种条件 INSERT 仅在它不存在的情况下才添加新数据集?
我正在使用SmallSQL
您可以在几乎所有关系数据库中使用单个语句和子查询来做到这一点。
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,您可能无法遵循上述建议或其他任何建议。
我不了解 SmallSQL,但这适用于 MSSQL:
IF EXISTS (SELECT * FROM Table1 WHERE Column1='SomeValue')
UPDATE Table1 SET (...) WHERE Column1='SomeValue'
ELSE
INSERT INTO Table1 VALUES (...)
根据 where 条件,如果存在则更新该行,否则将插入一个新行。
我希望这就是你要找的。
有条件是可以的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)
通常你制作你不想要重复的东西,并允许数据库本身拒绝插入。
否则,您可以使用 INSERT INTO,请参阅如何在 SQL Server 中的 INSERT INTO SELECT 查询中避免重复?
如果您正在寻找“upsert”,目前在 SQL Server 中对单行最有效的方法之一是:
UPDATE myTable ...
IF @@ROWCOUNT=0
INSERT INTO myTable ....
MERGE
如果您对数据集而不是单行执行此操作,也可以使用该语法。
如果你想INSERT
而不是UPDATE
那么你可以只写你的单个INSERT
语句并使用WHERE NOT EXISTS (SELECT ...)
我基于 SQL Server 中的 MERGE 语句编写此解决方案。请注意,MERGE 中的“源”不一定是表。
MERGE [my_target_table] t
USING (SELECT [val1]=... , [val2]=...) s
ON t.[val1]=s.[val1] AND t.[val2]=s.[val2]
WHEN MATCHED
THEN UPDATE set t.[val1]=s.[val1] ,
t.[val2]=s.[val2]
WHEN NOT MATCHED
THEN INSERT ([val1], [val2])
VALUES (s.[val1] , s.[val2]) ;