31

我有一个不时使用数据集更新的数据库。在这里,可能会交付已存在于数据库中的数据集。

目前我首先做一个

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

检查是否已经存在包含这些数据的数据集(使用 WHERE 语句中的数据)。如果这没有返回任何值,我正在做我的 INSERT。

但这对我来说似乎有点复杂。所以我的问题是:是否有某种条件 INSERT 仅在它不存在的情况下才添加新数据集?

我正在使用SmallSQL

4

6 回答 6

36

您可以在几乎所有关系数据库中使用单个语句和子查询来做到这一点。

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,您可能无法遵循上述建议或其他任何建议。

于 2013-05-19T16:19:03.177 回答
22

我不了解 SmallSQL,但这适用于 MSSQL:

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

根据 where 条件,如果存在则更新该行,否则将插入一个新行。

我希望这就是你要找的。

于 2013-05-19T16:14:21.930 回答
3

有条件是可以的EXISTSWHERE EXISTS测试子查询中是否存在任何记录。EXISTS如果子查询返回一条或多条记录,则返回 true。这是一个例子

UPDATE  TABLE_NAME 
SET val1=arg1 , val2=arg2
WHERE NOT EXISTS
    (SELECT FROM TABLE_NAME WHERE val1=arg1 AND val2=arg2)
于 2016-05-25T11:32:39.323 回答
0

通常你制作你不想要重复的东西,并允许数据库本身拒绝插入。

否则,您可以使用 INSERT INTO,请参阅如何在 SQL Server 中的 INSERT INTO SELECT 查询中避免重复?

于 2013-05-19T16:16:56.030 回答
0

如果您正在寻找“upsert”,目前在 SQL Server 中对单行最有效的方法之一是:

UPDATE myTable ...


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

MERGE如果您对数据集而不是单行执行此操作,也可以使用该语法。

如果你想INSERT而不是UPDATE那么你可以只写你的单个INSERT语句并使用WHERE NOT EXISTS (SELECT ...)

于 2013-05-19T16:19:02.987 回答
0

我基于 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]) ;
于 2021-12-10T10:28:33.593 回答