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

时间:2015-04-08 13:51:39

标签: sql sql-server

我有一个名为CustomerMemo的表格:

CustomerMemo

CustomerID
MemoID

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

CustomerID    MemoID
-----------   -------
1             1
1             2
1             3

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

CustomerID    MemoID
-----------   -------
1             1
1             1

任何人都知道如何在SQL Server中执行此操作?

4 个答案:

答案 0 :(得分:3)

您想在选择中使用DISTINCT关键字。

或者,如果您想阻止每个记录都包含相同的密钥,您需要在CustomerIDMemoID上设置UNIQUE约束

ALTER TABLE CustomerMemo
ADD CONSTRAINT [uc_CustomerMemo] UNIQUE(CustomerID, MemoID)

另一种方法是在CustomerMemoCustomerID

上的MemoID复合主键上创建主键
ALTER TABLE CustomerMemo
ADD CONSTRAINT pk_CustomerMemo PRIMARY KEY(CustomerID, MemoID)

答案 1 :(得分:2)

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

以下是MSDN上的文档:

CREATE INDEX (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

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

CREATE UNIQUE INDEX UNQ_CustomerMemo ON CustomerMemo (MemoID, CustomerID)
    WITH (IGNORE_DUP_KEY = ON);

使用IGNORE_DUP_KEY的缺点是您无法查看哪些数据违反了唯一约束。通常,最好在插入之前确保数据是唯一的,然后当您确实遇到某些问题时,您将得到错误以及违反唯一约束的值。这样可以更轻松地对insert语句进行故障排除。话虽这么说,我在定义表变量时会自由使用这个选项,因为范围是有限的。

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

答案 2 :(得分:1)

设置包含CustomerID和MemoID的唯一复合键,或者使主键成为CustomerID和MemoID的组合。这将确保您不能插入类似的重复项。

答案 3 :(得分:1)

请查看此主题: How can I create a SQL unique constraint based on 2 columns?

f.e。在sql server 2005中,您应该使用:SQL Server 2005 Unique constraint on two columns

您应该查找与您的数据库实现相关联的短语:UNIQUE CLUSTERED