我有一个我认为是完全琐碎的查询-插入值到一个表中,如果一个值与匹配的ID不存在:
BEGIN
INSERT INTO [dbo].[Contact_Categories](Contact_Category_ID, Description)
VALUES (1, 'Internal')
WHERE NOT EXISTS( SELECT * FROM [dbo].[Contact_Categories] WHERE Contact_Category_ID = 1)
END
我在where语句周围得到一个错误。为什么?我如何实现我的目标?
为什么不使用If语句?
IF NOT EXISTS
(select * from [dbo].[Contact_Categories] WHERE Contact_Category_ID = 1)
begin
insert into [dbo].[Contact_Categories] (Contact_Category_ID, Description)
values (1, 'Internal')
end
这样做的好处是,如果值存在,则不做任何事情。类似于这里提供的答案:SQL服务器如果不存在使用?
正确的处理方法是使用唯一索引/约束:
create unique index unq_Contact_Categories_Category_Id on Contact_Categories(Contact_Category_ID);
然后,数据库将保证列的唯一性。这可以防止比赛条件。
你可以用try
/cat
来捕获这个:
BEGIN TRY
INSERT INTO [dbo].[Contact_Categories](Contact_Category_ID, Description)
SELECT 1, 'Internal';
END TRY
BEGIN CATCH
PRINT 'Ooops'; -- you can even raise an error if you like.
END CATCH;
您的问题来自于WHERE
对UPDATE/SELECT有效,但是INSERT不明白它的意思。
但你可以绕过这个。将您的代码更改为:
BEGIN
INSERT INTO [dbo].[Contact_Categories](Contact_Category_ID, Description)
SELECT 1, 'Internal'
WHERE NOT EXISTS( SELECT * FROM [dbo].[Contact_Categories] WHERE Contact_Category_ID = 1)
END
问题内容: 我尝试插入新用户(如果用户表中不存在该用户),我尝试了此查询,但收到错误: 如果不存在,如何插入用户? 错误: 谢谢, 问题答案: 用途: 我可以这样写: 但是更好的方法可能只是放入一个唯一索引,以便数据库保护数据:
我想生成一个sql查询来批量插入一系列表中不存在的行。我当前的设置为每个记录插入创建了一个新的查询,类似于PostgreSQL中WHERE NOT EXISTS in PostgreSQL Gets syntax error中详细介绍的解决方案,但我想将其移动到单个查询以优化性能,因为我当前的设置一次可以生成几百个查询。现在我正在尝试下面添加的示例: Postgres返回以下错误: 问题是,Pos
问题内容: 我想将插入查询与“不存在的地方”组合起来,以免违反PK约束。但是,如下所示的语法给我一个错误- 我该怎么做? (通常,您可以将插入内容与where子句结合使用吗?) 问题答案: 编辑: 阅读马丁斯链接后,如果承认,最好的解决方案是:
问题内容: 我在使用SQL查询时遇到问题。如果同一行尚不存在,我需要插入一行。这是我到目前为止的内容: 我对sql不太熟悉,尤其是不存在的语法,因此在执行时会出现以下错误: ORA-06550:第37行,第11列:PLS-00103:在预期以下情况之一时遇到了符号“ INSERT”: 然后和或 用“ then”符号代替“ INSERT”继续。 following: the following: 问
我的代码是这样的: 我想使用WHERE NOT EXISTS SQL语句,以避免重复输入。我尝试了不同的写作方式,在cur沿线不存在的地方。execute(),但继续获取: sqlite3。操作错误:
问题内容: 我有以下查询要插入到表中 得到消息 消息4860,级别16,状态1,行1 无法批量加载。文件“ c:\ Type.txt”不存在。 该文件显然在那里。我可能会忽略什么? 问题答案: 看一下: 无法批量加载。文件“ c:\data.txt”不存在 该文件在SQL Server的驱动器上吗? SQL BULK INSERT等始终只能与SQL Server计算机上的本地驱动器一起使用。您的S