SQL - 插入不存在的位置

时间:2017-10-16 21:15:22

标签: sql sql-server sql-server-2012

我认为这是一个完全无关紧要的查询 - 如果不存在具有匹配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语句周围出错了。为什么?我如何实现目标?

enter image description here

5 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:1)

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

create unique index unq_Contact_Categories_Category_Id on Contact_Categories(Contact_Category_ID);

然后,数据库将保证列的唯一性。这可以防止竞争条件。

您可以使用try / catch

来捕获此信息
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;

答案 2 :(得分:0)

为什么不是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 Server IF NOT EXISTS Usage?

答案 3 :(得分:0)

我愿意:

INSERT INTO [dbo].[Contact_Categories](Contact_Category_ID, Description)
   VALUES (1, 'Internal')
   WHERE 1 NOT IN ( SELECT Contact_Category_ID FROM [dbo].[Contact_Categories]) 

答案 4 :(得分:0)

尝试用以下内容替换您的查询:

BEGIN
     IF NOT EXISTS (SELECT * FROM [dbo].[Contact_Categories] WHERE Contact_Category_ID = 1)
        INSERT INTO [dbo].[Contact_Categories](Contact_Category_ID,Description) VALUES (1, 'Internal')
END