Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 仅插入唯一值_Sql Server_Sql Server 2005_Tsql - Fatal编程技术网

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模式。