SQL Server -唯一索引与唯一约束-重复值

0x6upsns  于 2023-01-01  发布在  SQL Server
关注(0)|答案(3)|浏览(368)

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

1.如果列上有唯一索引而没有唯一约束,是否可以插入重复值?
1.那么列上的任何一个中的现有副本呢?它是否允许创建唯一索引或唯一约束?

6vl6ewon

6vl6ewon1#

如果列上有唯一索引而没有唯一约束,是否可以插入重复值?
通常,当列上存在唯一索引时,不能插入重复值,并且会引发错误。例外情况如下:
1.索引是用IGNORE_DUP_KEY选项创建的。没有出现错误,插入操作被忽略。
1.对非聚集索引进行筛选,使重复值不满足索引WHERE子句的要求。插入该行,但不反映在非聚集索引中。
那么列上的任何一个中的现有副本呢?它是否允许创建唯一索引或唯一约束?
否,但上面提到的过滤索引除外。

q9rjltbz

q9rjltbz2#

1.如果列上有唯一索引而没有唯一约束,是否可以插入重复值?
不,索引中列的值必须在该索引中创建唯一的数据集。
1.那么列上的任何一个中的现有副本呢?它是否允许创建唯一索引或唯一约束?
不可以,您不能在具有重复值的表上创建唯一索引。
找到答案的最简单的方法是尝试(我建议这样做,这是一种很好的学习方式):

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;
nnvyjq4y

nnvyjq4y3#

一个可能不直观的场景一开始让我很困惑:postgres不会将NULL值视为相等。如果您的表如下所示:

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

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

相关问题