在 SQL Server 中插入时忽略重复键

Leo*_*eon 2 sql sql-server

我有一张桌子叫做CustomerMemo

客户备忘录

CustomerID
MemoID
Run Code Online (Sandbox Code Playgroud)

这两个都是外键。这些列不是唯一的,因为可能是这样的:

CustomerID    MemoID
-----------   -------
1             1
1             2
1             3
Run Code Online (Sandbox Code Playgroud)

然而,我想避免的是这样的事情:

CustomerID    MemoID
-----------   -------
1             1
1             1
Run Code Online (Sandbox Code Playgroud)

有人知道如何在 SQL Server 中执行此操作吗?

Bre*_*ope 5

如果您确实想在插入时忽略重复键,那么您需要IGNORE_DUP_KEY在索引或唯一约束定义中使用索引选项。

这是MSDN上的文档:

创建索引 (Transact-SQL)

该文章中的示例(在 D 节中使用 IGNORE_DUP_KEY 选项):

CREATE TABLE #Test (C1 nvarchar(10), C2 nvarchar(50), C3 datetime);
GO
CREATE UNIQUE INDEX AK_Index ON #Test (C2)
    WITH (IGNORE_DUP_KEY = ON);
GO
INSERT INTO #Test VALUES (N'OC', N'Ounces', GETDATE());
INSERT INTO #Test SELECT * FROM Production.UnitMeasure;
GO
SELECT COUNT(*)AS [Number of rows] FROM #Test;
GO
DROP TABLE #Test;
GO
Run Code Online (Sandbox Code Playgroud)

对于您的表,这将是命令:

CREATE UNIQUE INDEX UNQ_CustomerMemo ON CustomerMemo (MemoID, CustomerID)
    WITH (IGNORE_DUP_KEY = ON);
Run Code Online (Sandbox Code Playgroud)

使用的缺点IGNORE_DUP_KEY是您无法了解哪些数据违反了唯一约束。通常,最好在插入之前确保数据是唯一的,然后当您确实有某些内容出现问题时,您将收到错误以及违反唯一约束的值。这将使插入语句的故障排除更加容易。话虽如此,由于范围有限,我在定义表变量时会自由使用此选项。

至于是否应该使用唯一键或唯一索引,请参阅以下有关堆栈溢出的问题: Unique key vs. unique index on SQL Server 2008