如何使用SQL进行有条件的插入?

39

我有一个数据库,不时会更新数据集。在这种情况下,可能会出现已经存在于数据库中的数据集被传递的情况。

目前,我首先执行

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

检查是否已存在具有这些数据的数据集(使用WHERE语句中的数据)。如果没有返回任何值,我会执行插入操作。

但这对我来说似乎有点复杂。所以我的问题是:是否有某种条件插入方法,仅在不存在数据集时添加新的数据集?

我正在使用SmallSQL


7
这个数据库系统是什么?SQL只是一个查询语言,被许多数据库产品所使用。SQL本身并不是一种数据库产品。因此,请告诉我们您正在使用的是MySQL、Postgres、Oracle、IBM DB2、SQL Server、Firebird或其他任何数据库系统... - marc_s
1
你是在谈论合并/更新吗? - Randy Levy
你也可以只使用 INSERT IGNORE INTO。 - Hayden Thring
6个回答

46

你可以在几乎所有关系型数据库中,通过一个单一的语句和子查询来实现这一点。

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,则可能无法遵循上述或任何其他建议,因为它可能不实现子查询。


4
如果您正在使用“INSERT... VALUES ('a,' 'b,' 'c')”,只需将语句更改为“INSERT... SELECT 'a','b','c' WHERE...”而不需要括号。 - Noumenon
请注意,在PostgreSQL中使用这种方法不能保证在同时发生插入操作的情况下始终有效。 - jackmott

25

我不知道SmallSQL,但这对于MSSQL有效:

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

根据 where 条件,如果存在该行则更新它,否则会插入一行新的记录。

希望这正是您所期待的。


6
我认为 IF 不是标准 SQL 的一部分。 - Andomar
4
这是我第一次感到高兴,因为我现在的雇主使用MSSQL数据库。 - Cheeku

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)

"SELECT"和"FROM"之间不应该有其他东西吗?(除了空格) - Lonnie Best
1
@LonnieBest - 可能是指 select val1, val2 from table_name ... - David R Tribble

0

我基于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]) ;

0

0
如果您想要执行“upsert”,目前在SQL Server中单行最有效的方法之一是这样的:

UPDATE myTable ...


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

如果你要处理数据集而不是单行数据,你也可以使用MERGE语法。

如果你想要执行INSERT而不是UPDATE,那么你只需要编写一个简单的INSERT语句并使用WHERE NOT EXISTS (SELECT ...)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接