УНИКАЛЬНЫЙ аргумент для создания ИНДЕКСА - для чего? - PullRequest
2 голосов
/ 26 сентября 2010

Почему оператор создания INDEX имеет аргумент UNIQUE?

Как я понимаю, некластеризованный индекс содержит закладку, указатель на строку, которая должна быть уникальной, чтобы различать даже неуникальные строки,
так, чтобы некластеризованный индекс был уникальным?
Правильно?

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

  • «Кластерный индекс в представлении должен быть уникальным» [1]

Поскольку «нижний или конечный уровень кластеризованного индекса содержит фактические строки данных таблицы» [1], правильно ли я понимаю, что тот же эффект, что и UNIUE для кластеризованного индекса, может быть достигнут уникальным ограничением на ( возможно все или часть) столбцов таблицы [2]?

Тогда, что дает уникальный аргумент для индекса?
кроме путаницы с определениями основных понятий [3]


Обновление:
Это опять та же ловушка - объяснение чего-то уже объясненного много раз на основе неопределенных терминов, превращающих все объяснения в бесконечную игру в догадки.
Пожалуйста, смотрите мой подвопрос [4], который действительно переписывает этот же вопрос здесь.


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


Цитируется:
[1]
CREATE INDEX (Transact-SQL)
http://msdn.microsoft.com/en-us/library/ms188783.aspx

[2] * +1039 * CREATE TABLE (Transact-SQL) http://msdn.microsoft.com/en-us/library/ms174979.aspx

[3] * +1044 * Уникальный индекс или уникальный ключ?
Уникальный индекс или уникальный ключ?

* * Тысяча сорок-девять [4]
Что такое индекс и может ли некластерный индекс быть неуникальным?
Что такое индекс и может ли некластеризованный индекс быть неуникальным?

Ответы [ 4 ]

6 голосов
/ 26 сентября 2010

В то время как неуникальный индекс достаточен для различения строк (как вы сказали), индекс UNIQUE служит ограничением: он предотвратит ввод дубликатов в базу данных, где «дубликаты» - это строки, содержащие те же данные в проиндексированных столбцах.

Пример:

 Firstname  | Lastname  | Login
================================
 Joe        | Smith     | joes
 Joe        | Taylor    | joet
 Susan      | Smith     | susans

Предположим, что логин по умолчанию генерируется из имени + первой буквы фамилии.

Что происходит, когда мы пытаемся добавить Джо Скиавилло в базу данных? Обычно система с радостью генерирует логин joes и вставляет (Joe,Sciavillo,joes). Теперь у нас будет два пользователя с одним и тем же именем - вероятно, это плохо.

Теперь предположим, что у нас есть индекс UNIQUE для столбца Login - база данных проверит, что другой строки с такими же данными уже не существует, прежде чем она позволит вставить новую строку. Другими словами, попытка вставить еще один joes будет отклонена, поскольку эти данные больше не будут уникальными в этой строке.

Конечно, вы можете иметь уникальные индексы для нескольких столбцов, и в этом случае комбинация данных должна быть уникальной (например, уникальный индекс для Firstname,Lastname с радостью примет строку с (Joe,Badzhanov), поскольку комбинации еще нет в таблице, но вторая строка будет отклонена с (Joe,Smith))

2 голосов
/ 29 сентября 2010

Предложение индекса UNIQUE на самом деле представляет собой просто причуду синтаксиса в SQL Server и некоторых других СУБД. В стандартном SQL ограничения уникальности реализуются с использованием синтаксиса PRIMARY KEY и UNIQUE CONSTRAINT, а не с помощью индексов (в стандартном SQL нет индексов).

Механизм, который SQL Server использует для реализации ограничений уникальности, называется уникальным индексом. Уникальный индекс создается для вас автоматически всякий раз, когда вы создаете ограничение PRIMARY KEY или UNIQUE. По причинам, наиболее известным команде разработчиков SQL Server, они решили представить ключевое слово UNIQUE как часть синтаксиса CREATE INDEX, даже если синтаксис ограничения выполняет ту же работу.

В интересах обеспечения ясности и поддержки стандартов я бы порекомендовал вам избегать создания уникальных индексов явно, где это возможно. Вместо этого используйте синтаксис ограничения PRIMARY KEY или UNQIUE.

0 голосов
/ 27 сентября 2010

Я думаю, что основной вопрос: в чем разница между уникальными и неуникальными индексами?

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

Например, рассмотрим таблицу позиций заказа:

ORDER_NO     INTEGER
LINE_NO      INTEGER
PRODUCT_NO   INTEGER
QUANTITY     DECIMAL

- с уникальным индексом ORDER_NO и LINE_NO и неуникальным индексом PRODUCT_NO.

Для одной комбинации ORDER_NO и LINE_NO в таблице может быть только одна запись, в то время как для одного значения PRODUCT_NO в таблице может быть много записей (поскольку в индексе будет много записей для этого значения) .

0 голосов
/ 26 сентября 2010

Предложение UNIQUE указывает, что значения в столбце (ах) должны быть уникальными по всей таблице, по существу добавляя уникальное ограничение.Кластерный индекс в таблице указывает, что порядок строк в таблице будет таким же, как в индексе.Некластеризованный индекс не меняет физический порядок, поэтому нормально иметь несколько некластеризованных, но только один кластеризованный индекс.В таблице могут быть уникальные или неуникальные кластеризованные и некластеризованные индексы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...