Sql-Server 唯一约束但具有非唯一数据

Ric*_*ard 1 sql-server sql-server-2008-r2 unique-constraint

我继承了这个数据库,它有一个定义如下的表:

CREATE TABLE home_tickets(
    id int IDENTITY(1,1) NOT NULL,
    identifier nvarchar(45) NOT NULL,
    start_date_time datetime NOT NULL,
    revised bit NOT NULL,
    agency_code nvarchar(100) NOT NULL,
    archived tinyint NOT NULL,

    CONSTRAINT PK__home_tic__3213E83F236943A5 PRIMARY KEY CLUSTERED (id ASC) WITH (
        PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON PRIMARY,

    CONSTRAINT UQ__home_tic__969168722645B050 UNIQUE NONCLUSTERED (identifier ASC) WITH (
        PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON PRIMARY
) ON PRIMARY
Run Code Online (Sandbox Code Playgroud)

但是,当我从给出的表中选择时,我identifier得到了多行返回。

select * from home_tickets where identifier = 'TI54815780';


id      identifier  start_date_time         revised archived
415044  TI54815780  2013-10-24 00:00:00.000 0       0
652845  TI54815780  2014-10-24 00:00:00.000 0       0
171642  TI54815780  2012-10-24 00:00:00.000 0       0
945275  TI54815780  2015-10-24 00:00:00.000 1       0
1220327 TI54815780  2016-10-24 00:00:00.000 1       0
Run Code Online (Sandbox Code Playgroud)

为什么在 上有唯一约束时会发生这种情况identifier

Dan*_*man 5

似乎底层约束索引已禁用。您可以通过以下方式验证:

SELECT is_disabled
FROM sys.indexes
WHERE
    object_id = OBJECT_ID(N'home_tickets')
    AND name = N'UQ__home_tic__969168722645B050';
Run Code Online (Sandbox Code Playgroud)

修复错误值后,重建索引以启用约束:

ALTER INDEX UQ__home_tic__969168722645B050 ON home_tickets REBUILD;
Run Code Online (Sandbox Code Playgroud)