仅插入唯一值

时间:2011-04-29 19:17:20

标签: sql-server sql-server-2005 tsql

我需要找到一种最有效的方法来将值插入到表中,但只有当该值不在表中时才会显示。

这是一个示例表:

DECLARE @Table table (TheValue int primary key)

要插入的示例数据:

INSERT @Table SELECT 1 UNION SELECT 2 UNION SELECT 3 --existing data
DECLARE @x int;set @x=5                              --data to add

这里是我能想到的所有想法。哪一个最好和/或有更好的方法?这是一个批处理过程,因此不存在其他进程插入数据的风险,因此在Try 1中不需要锁定。

尝试1:

IF NOT EXISTS (SELECT 1 FROM @Table WHERE TheValue=@x)
BEGIN
    INSERT @Table VALUES (@x)
END

尝试2:

INSERT @Table SELECT @x EXCEPT SELECT TheValue FROM @Table

尝试3:

INSERT @Table SELECT @x WHERE @X NOT IN (SELECT TheValue FROM @Table)

尝试4:

BEGIN TRY
    INSERT @Table VALUES (@x)
END TRY
BEGIN CATCH END CATCH

2 个答案:

答案 0 :(得分:2)

为什么不在该列上设置唯一约束

答案 1 :(得分:1)

这是另一种方法,通过自我加入表插入并仅插入尚不存在的记录。

首先是您要批量插入的表,您要在哪里维护唯一记录。请记住,您应该在这里有一个独特的约束。您只想使用这些唯一插入之一,以便永远不会遇到约束:

DECLARE @Table table (TheValue int primary key) 

从您想要插入主批处理表中获取数据的表格之一:

DECLARE @TableSelectingFrom table (TheValue int primary key) 

例如,只需用记录填充它:

insert @TableSelectingFrom select 1

有一个左外连接,因此我们只从@TableSelectingFrom中提取唯一记录:

INSERT into @Table 
SELECT a.TheValue
from @TableSelectingFrom a
left join @Table b on a.TheValue = b.TheValue
where b.TheValue is null

select * from @Table