如何在多列上设置唯一约束?

20
EmpID DeptID

1     1
1     2
2     1
3     2
4     5
5     2
1     1   
2     1   

我希望有一个约束条件,确保此字段对的唯一性,例如上面示例中最后两行数据不能插入到表中。请注意,最后两行数据是重复的,我希望防止这种情况发生。 如何在SQLServer 2005中实现?谢谢。

4个回答

22
ALTER TABLE <YourTable, sysname, Emp> 
ADD CONSTRAINT <YourConstraintName, sysname, uix> 
UNIQUE NONCLUSTERED (EmpID,DeptID) 

(将其粘贴到SSMS中并使用(CTRL + Shift + M))

或者在创建表时进行此操作,因为似乎没有备选键可用。

CREATE TABLE EMPLOYEE_DEPARTMENT(
    EmpID int NOT NULL REFERENCES EMPLOYEE(EmpID),
    DeptID int NOT NULL REFERENCES DEPARTMENT(DeptID),
 CONSTRAINT PK_EMPLOYEE_DEPARTMENT PRIMARY KEY CLUSTERED (EmpID ASC,DeptID ASC)
)

谢谢,难道在表创建期间不能做些什么吗? - Thunder
@Thunder - 你的表格目前有主键吗? - Martin Smith
1
@Thunder - 对于这些表来说,仍然通常具有复合主键。 - Martin Smith

10

在你去除重复项之后,运行以下代码(替换适当的名称)

ALTER TABLE table ADD CONSTRAINT UQ_EmpID_DeptID UNIQUE (EmpID,DeptID)

或者在创建表时:

CREATE TABLE T1 (
    EmpID int not null,
    DeptID int not null,
    /* Other Columns */
    constraint PK_T1 PRIMARY KEY (EmpID,DeptID)
)

最好将其作为主键,除非你在表中有其他主键。


4

ALTER TABLE dbo.YOURTABLE ADD CONSTRAINT IX_YOURTABLE UNIQUE NONCLUSTERED (EmpID, DeptID)

的意思是在dbo.YOURTABLE表中添加一个名为IX_YOURTABLE的唯一非聚集约束,该约束包含EmpID和DeptID两列。

1
select empID, deptID from table
group by empID, deptID

编辑:

如果您的意思是这个数据在表中必须是唯一的,也就是说不允许插入重复的数据,那么您需要在这个表上定义一个复合主键(empID,deptID)。

alter table <tablename> add constraint <compositekeyname> primary key (empID, deptID)

我正在寻找一个在创建表时放置约束而不是在选择时放置约束的方法。 - Thunder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接