Pertanyaan ini ditandai dengan SQL Server 2000 tetapi untuk kepentingan orang-orang yang mengembangkan versi terbaru saya akan membahasnya terlebih dahulu.
SQL Server 2014
Selain metode menambahkan indeks berbasis kendala yang dibahas di bawah ini, SQL Server 2014 juga memungkinkan indeks yang tidak unik ditentukan secara langsung dengan sintaks sebaris pada deklarasi variabel tabel.
Sintaks contoh untuk itu di bawah ini.
/*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*/
);
Indeks dan indeks yang difilter dengan kolom yang disertakan saat ini tidak dapat dideklarasikan dengan sintaks ini namun SQL Server 2016 melonggarkan ini sedikit lebih jauh. Dari CTP 3.1 sekarang dimungkinkan untuk mendeklarasikan indeks yang difilter untuk variabel tabel. Dengan RTM itu mungkin kasus yang menyertakan kolom juga diperbolehkan tetapi posisi saat ini adalah bahwa mereka "kemungkinan tidak akan masuk ke SQL16 karena keterbatasan sumber daya"
/*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
Bisakah saya membuat indeks pada Nama?
Jawaban singkat: Ya.
DECLARE @TEMPTABLE TABLE (
[ID] [INT] NOT NULL PRIMARY KEY,
[Name] [NVARCHAR] (255) COLLATE DATABASE_DEFAULT NULL,
UNIQUE NONCLUSTERED ([Name], [ID])
)
Jawaban lebih rinci ada di bawah.
Tabel tradisional di SQL Server dapat memiliki indeks berkerumun atau disusun sebagai tumpukan .
Indeks yang dikelompokkan dapat dinyatakan sebagai unik untuk melarang nilai kunci duplikat atau default menjadi tidak unik. Jika tidak unik maka SQL Server menambahkan diam-diam a unikifier ke kunci duplikat untuk membuatnya unik.
Indeks non-cluster juga dapat secara eksplisit dinyatakan unik. Jika tidak, untuk kasus yang tidak unik SQL Server menambahkan baris locator (kunci indeks berkerumun atau RID untuk heap) ke semua kunci indeks (bukan hanya duplikat) ini lagi memastikan mereka unik.
Dalam SQL Server 2000 - 2012 indeks pada variabel tabel hanya dapat dibuat secara implisit dengan membuat UNIQUE
atau PRIMARY KEY
kendala. Perbedaan antara jenis kendala ini adalah bahwa kunci utama harus pada kolom yang tidak dapat dibatalkan. Kolom yang berpartisipasi dalam kendala unik mungkin nullable. (meskipun implementasi SQL Server kendala unik di hadapan NULL
s tidak sesuai yang ditentukan dalam SQL Standard). Juga sebuah tabel hanya dapat memiliki satu kunci utama tetapi beberapa kendala unik.
Kedua kendala logis ini diimplementasikan secara fisik dengan indeks yang unik. Jika tidak ditentukan secara eksplisit, maka PRIMARY KEY
akan menjadi indeks berkerumun dan kendala unik yang tidak berkerumun tetapi perilaku ini dapat diganti dengan menentukan CLUSTERED
atau NONCLUSTERED
secara eksplisit dengan deklarasi kendala (Contoh sintaks)
DECLARE @T TABLE
(
A INT NULL UNIQUE CLUSTERED,
B INT NOT NULL PRIMARY KEY NONCLUSTERED
)
Sebagai hasil dari di atas indeks berikut ini dapat secara implisit dibuat pada variabel tabel di 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 |
+-------------------------------------+-------------------------------------+
Yang terakhir membutuhkan sedikit penjelasan. Dalam tabel definisi variabel di awal jawaban ini indeks non clustered non unikName
disimulasikan oleh indeks unik on Name,Id
(ingat bahwa SQL Server akan diam-diam menambahkan kunci indeks clustered ke kunci NCI non unik pula).
Indeks IDENTITY
kluster yang tidak unik juga dapat dicapai dengan menambahkan kolom secara manual untuk bertindak sebagai pemisah.
DECLARE @T TABLE
(
A INT NULL,
B INT NULL,
C INT NULL,
Uniqueifier INT NOT NULL IDENTITY(1,1),
UNIQUE CLUSTERED (A,Uniqueifier)
)
Tapi ini bukan simulasi yang akurat tentang bagaimana indeks berkerumun non unik biasanya sebenarnya diimplementasikan dalam SQL Server karena ini menambahkan "Uniqueifier" ke semua baris. Bukan hanya mereka yang membutuhkannya.