SQL 服务器 - 唯一索引与唯一约束 - Re。重复值

SQL Server - Unique index vs Unique constraint - Re. Duplicate values

唯一索引确保索引键列中的值是唯一的。 唯一约束 保证不会将重复值插入到创建约束的列中。创建唯一约束后,会自动在列上创建相应的唯一索引。

问题

  1. 如果我们在列上有唯一索引并且没有唯一约束,是否可以插入重复值?
  2. 任何列中的现有重复项如何 - 是否允许创建唯一索引或唯一约束?
  1. 如果我们在列上有唯一索引并且没有唯一约束,是否可以插入重复值?

不,索引中列的值必须在该索引中创建一组唯一的数据。

  1. 任何列中的现有重复项如何 - 是否允许创建唯一索引或唯一约束?

不,您不能在具有重复值的 table 上创建唯一索引。

发现这一点的最简单方法是尝试(我建议这样做,这是一种很好的学习方式):

CREATE TABLE dbo.SomeTable (SomeInt int, AnotherInt int);
GO

INSERT INTO dbo.SomeTable (SomeInt,
                           AnotherInt)
VALUES (1,1),
       (1,2),
       (2,1);
GO
--Create a unique index on a column with duplicate values
CREATE UNIQUE INDEX UQ_SomeInt ON dbo.SomeTable(SomeInt); --fails
GO
--Create a unique index on the 2 columns, as they are unique
CREATE UNIQUE INDEX UQ_Some_AnotherInt ON dbo.SomeTable(SomeInt, AnotherInt); --Succeeds
GO
--Try to insert a duplicate value
INSERT INTO dbo.SomeTable (SomeInt,
                           AnotherInt)
VALUES(2,1); --fails
GO

SELECT *
FROM dbo.SomeTable
GO
DROP TABLE dbo.SomeTable;

Can duplicate values be inserted if we have a unique index on a column and no unique constraint?

一般情况下,当列上存在唯一索引时,不能插入重复值。例外情况是:

1) 索引是使用 IGNORE_DUP_KEY 选项创建的

2)过滤非聚集索引使得重复值不满足索引WHERE子句

What about existing duplicates in any on the column - will it allow to create unique index or unique constraint?

没有,上面提到的过滤索引除外。

一开始让我感到困惑的一个可能不直观的场景:postgres does not treat NULL values as equal. 如果您的 table 看起来像这样:

+-------+-------+-------+
|id     |a      |b      |
+-------+-------+-------+
|1      |0      |NULL   |
|2      |0      |NULL   |
+-------+-------+-------+

您仍然可以在列 ab 上添加唯一索引。根据 Postgres,id 为 1 的行和 id 为 2 的行对于列 a 具有相同的值,但对于列 b

具有不同的值