SQL Server - Уникальный индекс против уникального ограничения - Re. Повторяющиеся значения

Уникальный индекс гарантирует уникальность значений в столбцах ключа индекса. Ограничение уникальности гарантирует, что никакие повторяющиеся значения не могут быть вставлены в столбцы, в которых создается ограничение. Когда создается ограничение уникальности, для столбца (столбцов) автоматически создается соответствующий индекс уникальности.

Вопросы:

  1. Можно ли вставить повторяющиеся значения, если у нас есть уникальный индекс для столбца и нет уникальных ограничений?
  2. А как насчет существующих дубликатов в любом столбце - позволит ли это создать уникальный индекс или уникальное ограничение?

person variable    schedule 17.10.2018    source источник


Ответы (2)


Можно ли вставить повторяющиеся значения, если у нас есть уникальный индекс для столбца и нет уникальных ограничений?

Как правило, повторяющиеся значения не могут быть вставлены, если для столбца существует уникальный индекс. Исключения составляют:

1) Индекс был создан с помощью _ 1_ вариант

2) Некластеризованный индекс фильтруется таким образом, что повторяющееся значение не удовлетворяет условию индекса WHERE

А как насчет существующих дубликатов в любом столбце - позволит ли это создать уникальный индекс или уникальное ограничение?

Нет, за исключением упомянутого выше отфильтрованного индекса.

person Dan Guzman    schedule 17.10.2018
comment
Чтобы уточнить, использование IGNORE_DUP_KEY не позволяет дублировать значения в индексе. Уникальный индекс никогда не имеет повторяющихся значений. Вместо этого IGNORE_DUP_KEY просто заставляет игнорировать попытки вставить повторяющиеся значения (с предупреждением) вместо того, чтобы вызывать ошибку. - person John Rees; 17.09.2019

  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;
person Larnu    schedule 17.10.2018