我有一个名为CustomerMemo
的表格:
CustomerMemo
CustomerID
MemoID
这两个都是外键。列不是唯一的,因为可能有这样的东西:
CustomerID MemoID
----------- -------
1 1
1 2
1 3
然而,我想要避免的是这样的:
CustomerID MemoID
----------- -------
1 1
1 1
任何人都知道如何在SQL Server中执行此操作?
答案 0 :(得分:3)
您想在选择中使用DISTINCT
关键字。
或者,如果您想阻止每个记录都包含相同的密钥,您需要在CustomerID
和MemoID
上设置UNIQUE
约束
ALTER TABLE CustomerMemo
ADD CONSTRAINT [uc_CustomerMemo] UNIQUE(CustomerID, MemoID)
另一种方法是在CustomerMemo
和CustomerID
MemoID
复合主键上创建主键
ALTER TABLE CustomerMemo
ADD CONSTRAINT pk_CustomerMemo PRIMARY KEY(CustomerID, MemoID)
答案 1 :(得分:2)
如果您确实想在插入时忽略重复键,那么您需要在索引或唯一约束定义中使用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
的缺点是您无法查看哪些数据违反了唯一约束。通常,最好在插入之前确保数据是唯一的,然后当您确实遇到某些问题时,您将得到错误以及违反唯一约束的值。这样可以更轻松地对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
。