Sql server 仅插入唯一值
我需要找到最有效的方法将值插入表中,但仅当该值不在表中时 下面是一个示例表:Sql server 仅插入唯一值,sql-server,sql-server-2005,tsql,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 以下是我能想到的所有方法。哪一
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
为什么不在该列上设置一个唯一的约束呢?这里还有另一种方法,即自连接插入到的表,并且只插入不存在的记录 首先是执行批处理插入的表,您希望在其中维护唯一记录。请记住,这里应该有一个唯一的约束。您只希望使用其中一个唯一的插入,以避免遇到约束:
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
您可以通过@Quassnoi查看此链接,并查看
不在
、不存在
和左加入
的性能差异。没有任何情况下总是最快的。我希望#2在大多数情况下都是最有效的,但您必须进行配置才能确定。可能重复的问题已经被问了几十次了…请在问新问题之前使用搜索功能@JNK,你会在搜索中使用什么关键字?DECLARE@Table表中的primary key
部分(value int primary key)
在列上设置了一个唯一的约束。那么我肯定缺少什么。只要运行update语句,如果该值已经存在,mssql将抛出一个错误,否则它将成功。主键
确实提供了一个唯一的约束。如果您使用问题中的示例代码,并尝试插入一个副本,您将收到Msg 2627,级别14,状态1,行xyz违反主键约束…
消息。这似乎与您尝试执行的操作一致。。防止该列中的值重复。。我遗漏了什么?也就是我链接到的可能重复的JFDI模式。