SQL Server - уникальный индекс против уникального ограничения - Re.Дублирующиеся значения - PullRequest
0 голосов
/ 17 октября 2018

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

Цитаты :

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

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

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

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

1) Индекс был создан с опцией IGNORE_DUP_KEY

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

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

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

0 голосов
/ 17 октября 2018
  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;
...