2010-09-26 1 views
2

Почему заявление о создании INDEX имеет УНИКАЛЬНЫЙ аргумент?УНИКАЛЬНЫЙ аргумент для создания INDEX - зачем?

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

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

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

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

Затем, что приносит УНИКАЛЬНЫЙ аргумент для индекса?
кроме путаницы основных определений понятий [3]


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


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


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

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

[ 3]
Уникальный указатель или уникальный ключ?
Unique index or unique key?

[4]
что индекс и может некластерный индекс быть не уникальным?
what is index and can non-clustered index be non-unique?

ответ

2

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

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

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

6

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

Пример:

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

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

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

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

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

+0

P; z см. Мое обновление в главном сообщении. –

+0

@ vgv8: Это не переформулировка, это совершенно другой вопрос. (Мне тоже не интересно угадывать игры, пока) – Piskvor

0

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

0

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

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

Для примера рассмотрим таблицу позиции заказа:

ORDER_NO  INTEGER 
LINE_NO  INTEGER 
PRODUCT_NO INTEGER 
QUANTITY  DECIMAL 

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

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