我有一个数据库,不时会更新数据集。在这种情况下,可能会出现已经存在于数据库中的数据集被传递的情况。
目前,我首先执行
SELECT FROM ... WHERE val1=... AND val2=...
检查是否已存在具有这些数据的数据集(使用WHERE语句中的数据)。如果没有返回任何值,我会执行插入操作。
但这对我来说似乎有点复杂。所以我的问题是:是否有某种条件插入方法,仅在不存在数据集时添加新的数据集?
我正在使用SmallSQL
我有一个数据库,不时会更新数据集。在这种情况下,可能会出现已经存在于数据库中的数据集被传递的情况。
目前,我首先执行
SELECT FROM ... WHERE val1=... AND val2=...
检查是否已存在具有这些数据的数据集(使用WHERE语句中的数据)。如果没有返回任何值,我会执行插入操作。
但这对我来说似乎有点复杂。所以我的问题是:是否有某种条件插入方法,仅在不存在数据集时添加新的数据集?
我正在使用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 条件,如果存在该行则更新它,否则会插入一行新的记录。
希望这正是您所期待的。
IF
不是标准 SQL 的一部分。 - Andomar使用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)
select val1, val2 from table_name ...
。 - David R Tribble我基于SQL Server中的MERGE语句编写了这个解决方案。请注意,MERGE中的"source"不一定是一个表。
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]) ;
UPDATE myTable ...
IF @@ROWCOUNT=0
INSERT INTO myTable ....
如果你要处理数据集而不是单行数据,你也可以使用MERGE
语法。
如果你想要执行INSERT
而不是UPDATE
,那么你只需要编写一个简单的INSERT
语句并使用WHERE NOT EXISTS (SELECT ...)
。