我有一个名为 CustomerMemo
的表:
客户备忘录
CustomerID
MemoID
这两个都是外键。这些列不是唯一的,因为可能是这样的:
CustomerID MemoID
----------- -------
1 1
1 2
1 3
但是,我想避免的是这样的事情:
CustomerID MemoID
----------- -------
1 1
1 1
有人知道如何在 SQL Server 中执行此操作吗?
最佳答案
如果您真的想在插入时忽略重复键,那么您需要在索引或唯一约束定义中使用 IGNORE_DUP_KEY
索引选项。
这是 MSDN 上的文档:
该文章中的示例(在 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
对于您的表,这将是命令:
CREATE UNIQUE INDEX UNQ_CustomerMemo ON CustomerMemo (MemoID, CustomerID)
WITH (IGNORE_DUP_KEY = ON);
使用 IGNORE_DUP_KEY
的缺点是您无法看到哪些数据违反了唯一约束。一般来说,最好在插入之前确保数据是唯一的,然后当你确实有一些东西从裂缝中掉下来时,你会得到错误,以及违反唯一约束的值。这将使插入语句的故障排除更加容易。也就是说,我在定义表变量时自由使用了这个选项,因为范围是有限的。
至于是否应该使用唯一键或唯一索引,请参见以下关于堆栈溢出的问题: Unique key vs. unique index on SQL Server 2008
关于sql - 在 SQL Server 中插入时忽略重复键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29516637/