Питання позначено тегом SQL Server 2000, але для користі людей, що розробляють останню версію, я вирішу це першим.
SQL Server 2014
На додаток до методів додавання індексів на основі обмежень, що обговорюються нижче, SQL Server 2014 також дозволяє не унікальні індекси визначати безпосередньо за допомогою вбудованого синтаксису на таблиці змінних оголошень.
Приклад синтаксису для цього наведено нижче.
/*SQL Server 2014+ compatible inline index syntax*/
DECLARE @T TABLE (
C1 INT INDEX IX1 CLUSTERED, /*Single column indexes can be declared next to the column*/
C2 INT INDEX IX2 NONCLUSTERED,
INDEX IX3 NONCLUSTERED(C1,C2) /*Example composite index*/
);
Відфільтровані індекси та індекси з включеними стовпцями наразі не можна оголосити цим синтаксисом, однак SQL Server 2016 дещо послаблює це. З CTP 3.1 тепер можна оголосити відфільтровані індекси для змінних таблиці. За допомогою RTM може бути так, що включені стовпці також дозволені, але поточна позиція полягає в тому, що вони ", ймовірно, не перетворять його в SQL16 через обмеження ресурсів".
/*SQL Server 2016 allows filtered indexes*/
DECLARE @T TABLE
(
c1 INT NULL INDEX ix UNIQUE WHERE c1 IS NOT NULL /*Unique ignoring nulls*/
)
SQL Server 2000 - 2012
Чи можу я створити індекс на ім’я?
Коротка відповідь: Так.
DECLARE @TEMPTABLE TABLE (
[ID] [INT] NOT NULL PRIMARY KEY,
[Name] [NVARCHAR] (255) COLLATE DATABASE_DEFAULT NULL,
UNIQUE NONCLUSTERED ([Name], [ID])
)
Більш детальна відповідь наведена нижче.
Традиційні таблиці в SQL Server можуть або мати кластерний індекс, або структурувати як купи .
Кластеризовані індекси можуть бути оголошені як унікальні для заборони повторюваних значень ключа або за замовчуванням до не унікальних. Якщо не унікальний, то SQL Server мовчки додає унікальний код до будь-яких повторюваних ключів, щоб зробити їх унікальними.
Некластеризовані індекси також можуть бути явно оголошені унікальними. Інакше для не унікального випадку SQL Server додає локатор рядків (кластерний індексний ключ або RID для купи) до всіх індексних ключів (а не лише дублікатів), що ще раз гарантує їх унікальність.
У SQL Server 2000 - 2012 індекси для змінних таблиць можна створювати лише неявно шляхом створення UNIQUE
або PRIMARY KEY
обмеження. Різниця між цими типами обмежень полягає в тому, що первинний ключ повинен знаходитись у стовпчиках, що не змінюються. Стовпці, що беруть участь в унікальному обмеженні, можуть бути нульовими. (хоча реалізація унікальних обмежень SQL Server у присутності NULL
s не відповідає тій, що визначена у стандарті SQL). Також таблиця може мати лише один первинний ключ, але кілька унікальних обмежень.
Обидва ці логічні обмеження фізично реалізуються з унікальним індексом. Якщо явно не вказано інше, PRIMARY KEY
індекс стане кластерним індексом та унікальними обмеженнями, некластеризованими, але цю поведінку можна перекрити, вказавши CLUSTERED
або NONCLUSTERED
явно за допомогою декларації обмеження (Приклад синтаксису)
DECLARE @T TABLE
(
A INT NULL UNIQUE CLUSTERED,
B INT NOT NULL PRIMARY KEY NONCLUSTERED
)
У результаті вищезазначених нижче індекси можуть бути неявно створені на табличних змінних у SQL Server 2000 - 2012.
+-------------------------------------+-------------------------------------+
| Index Type | Can be created on a table variable? |
+-------------------------------------+-------------------------------------+
| Unique Clustered Index | Yes |
| Nonunique Clustered Index | |
| Unique NCI on a heap | Yes |
| Non Unique NCI on a heap | |
| Unique NCI on a clustered index | Yes |
| Non Unique NCI on a clustered index | Yes |
+-------------------------------------+-------------------------------------+
Останній вимагає трохи пояснень. У визначенні змінної таблиці на початку цієї відповіді не унікальний некластеризований індекс на Name
моделюється унікальним індексом на Name,Id
(нагадуємо, що SQL Server як би мовчки додав кластеризований індексний ключ до не унікального ключа NCI).
Не унікальний кластерний індекс також може бути досягнутий шляхом додавання IDENTITY
стовпця вручну, щоб діяти як унікальний код.
DECLARE @T TABLE
(
A INT NULL,
B INT NULL,
C INT NULL,
Uniqueifier INT NOT NULL IDENTITY(1,1),
UNIQUE CLUSTERED (A,Uniqueifier)
)
Але це не є точним моделюванням того, як не унікальний кластерний індекс, як правило, реалізовується в SQL Server, оскільки це додає "Унікальник" у всі рядки. Не тільки тих, хто цього вимагає.