我需要找到一种最有效的方法来将值插入到表中,但只有当该值不在表中时才会显示。
这是一个示例表:
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
答案 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