当前位置: 首页 > 知识库问答 >
问题:

SQL-在不存在的地方插入

束高雅
2023-03-14

我有一个我认为是完全琐碎的查询-插入值到一个表中,如果一个值与匹配的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语句周围得到一个错误。为什么?我如何实现我的目标?

共有3个答案

司徒元明
2023-03-14

为什么不使用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服务器如果不存在使用?

耿志义
2023-03-14

正确的处理方法是使用唯一索引/约束:

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;
穆单鹗
2023-03-14

您的问题来自于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