如何在SQL Server中创建多列唯一约束

Nei*_*ski 18 sql-server indexing duplicates

我有一个表,包含,例如,我想在数据库中使两个字段唯一.例如:

create table Subscriber (
    ID int not null,
    DataSetId int not null,
    Email nvarchar(100) not null,
    ...
)
Run Code Online (Sandbox Code Playgroud)

ID列是主键,DataSetId和Email都被编入索引.

我希望能够做的是阻止表中出现相同的Email和DataSetId组合,换句话说,对于给定的DataSetId,Email值必须是唯一的.

我尝试在列上创建一个唯一索引

CREATE UNIQUE NONCLUSTERED INDEX IX_Subscriber_Email
ON Subscriber (DataSetId, Email)
Run Code Online (Sandbox Code Playgroud)

但我发现这对搜索时间产生了相当大的影响(例如,当搜索电子邮件地址时 - 表中有150万行).

有没有更有效的方法来实现这种类型的约束?

Rem*_*anu 32

但我发现这对搜索时间有很大影响(例如搜索电子邮件地址时)

您定义的索引(DataSetId, Email)不能用于基于电子邮件的搜索.如果要Email在最左边的位置创建一个索引,可以使用它:

CREATE UNIQUE NONCLUSTERED INDEX IX_Subscriber_Email
   ON Subscriber (Email, DataSetId);
Run Code Online (Sandbox Code Playgroud)

该索引既可以作为唯一约束强制执行,也可以作为快速搜索电子邮件的方法.此索引虽然不能用于快速搜索特定的DataSetId.

它的要点是,无论何时定义多键索引,它都只能用于按键顺序搜索.索引on (A, B, C)可用于在列A上搜索值,用于搜索两者上的A和/ B或搜索所有三列上的值A,B以及C.但是,它不能用于单独搜索B或打开值C.

  • 很有可能,但套用 [Elmer Fud](http://en.wikipedia.org/wiki/Elmer_Fudd) 的话,OP 是 *vewy vewy 安静* <g> (2认同)
  • 现在你只是传播[Fud](http://en.wikipedia.org/wiki/Fear,_uncertainty_and_doubt);) (2认同)