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;
3条答案
按热度按时间6vl6ewon1#
如果列上有唯一索引而没有唯一约束,是否可以插入重复值?
通常,当列上存在唯一索引时,不能插入重复值,并且会引发错误。例外情况如下:
1.索引是用
IGNORE_DUP_KEY
选项创建的。没有出现错误,插入操作被忽略。1.对非聚集索引进行筛选,使重复值不满足索引
WHERE
子句的要求。插入该行,但不反映在非聚集索引中。那么列上的任何一个中的现有副本呢?它是否允许创建唯一索引或唯一约束?
否,但上面提到的过滤索引除外。
q9rjltbz2#
1.如果列上有唯一索引而没有唯一约束,是否可以插入重复值?
不,索引中列的值必须在该索引中创建唯一的数据集。
1.那么列上的任何一个中的现有副本呢?它是否允许创建唯一索引或唯一约束?
不可以,您不能在具有重复值的表上创建唯一索引。
找到答案的最简单的方法是尝试(我建议这样做,这是一种很好的学习方式):
nnvyjq4y3#
一个可能不直观的场景一开始让我很困惑:postgres不会将
NULL
值视为相等。如果您的表如下所示:您仍然可以在列
a
和b
上添加唯一索引。根据Postgres,id为1
的行和id为2
的行对于列a
具有相同的值,但是对于列b
具有不同的值