SQL 服务器 - 唯一索引与唯一约束 - Re。重复值
SQL Server - Unique index vs Unique constraint - Re. Duplicate values
唯一索引确保索引键列中的值是唯一的。
唯一约束 保证不会将重复值插入到创建约束的列中。创建唯一约束后,会自动在列上创建相应的唯一索引。
问题:
- 如果我们在列上有唯一索引并且没有唯一约束,是否可以插入重复值?
- 任何列中的现有重复项如何 - 是否允许创建唯一索引或唯一约束?
- 如果我们在列上有唯一索引并且没有唯一约束,是否可以插入重复值?
不,索引中列的值必须在该索引中创建一组唯一的数据。
- 任何列中的现有重复项如何 - 是否允许创建唯一索引或唯一约束?
不,您不能在具有重复值的 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 |
+-------+-------+-------+
您仍然可以在列 a
和 b
上添加唯一索引。根据 Postgres,id 为 1
的行和 id 为 2
的行对于列 a
具有相同的值,但对于列 b
具有不同的值
唯一索引确保索引键列中的值是唯一的。 唯一约束 保证不会将重复值插入到创建约束的列中。创建唯一约束后,会自动在列上创建相应的唯一索引。
问题:
- 如果我们在列上有唯一索引并且没有唯一约束,是否可以插入重复值?
- 任何列中的现有重复项如何 - 是否允许创建唯一索引或唯一约束?
- 如果我们在列上有唯一索引并且没有唯一约束,是否可以插入重复值?
不,索引中列的值必须在该索引中创建一组唯一的数据。
- 任何列中的现有重复项如何 - 是否允许创建唯一索引或唯一约束?
不,您不能在具有重复值的 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 |
+-------+-------+-------+
您仍然可以在列 a
和 b
上添加唯一索引。根据 Postgres,id 为 1
的行和 id 为 2
的行对于列 a
具有相同的值,但对于列 b