Pertanyaannya diberi tag SQL Server 2000 tetapi untuk kepentingan orang-orang yang mengembangkan versi terbaru, saya akan membahasnya terlebih dahulu.
SQL Server 2014
Selain metode penambahan indeks berbasis kendala yang dibahas di bawah SQL Server 2014 juga memungkinkan indeks non unik untuk ditentukan secara langsung dengan sintaks sebaris pada deklarasi variabel tabel.
Contoh sintaks untuk itu ada di bawah.
/*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 santai ini sedikit lebih jauh. Dari CTP 3.1 sekarang dimungkinkan untuk mendeklarasikan indeks yang difilter untuk variabel tabel. Dengan RTM itu mungkin dalam kasus bahwa kolom yang disertakan juga diperbolehkan tetapi posisi saat ini adalah bahwa mereka "kemungkinan tidak akan berhasil masuk ke SQL16 karena kendala 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 di 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 yang lebih detail ada di bawah.
Tabel tradisional di SQL Server dapat memiliki indeks berkerumun atau disusun sebagai tumpukan.
Indeks berkerumun dapat dideklarasikan sebagai unik untuk melarang nilai kunci duplikat atau default ke non unik. Jika tidak unik, maka SQL Server secara diam-diam menambahkan uniqueifier ke kunci duplikat apa pun untuk menjadikannya unik.
Indeks yang tidak berkerumun juga dapat dinyatakan secara eksplisit sebagai unik. Jika tidak, untuk kasus yang tidak unik, SQL Server menambahkan pencari baris (kunci indeks berkerumun atau RID untuk heap) ke semua kunci indeks (bukan hanya duplikat) sekali lagi ini memastikan kunci tersebut unik.
Di SQL Server 2000 - 2012 indeks pada tabel variabel hanya dapat dibuat secara implisit dengan membuat UNIQUE
atau PRIMARY KEY
paksaan. Perbedaan antara tipe batasan ini adalah bahwa kunci utama harus berada pada kolom yang tidak dapat dibatalkan. Kolom yang berpartisipasi dalam batasan unik mungkin dapat dibatalkan. (meskipun implementasi SQL Server dari kendala unik dengan adanya NULL
s bukan per yang ditentukan dalam Standar SQL). Juga sebuah tabel hanya dapat memiliki satu kunci utama tetapi beberapa batasan unik.
Kedua batasan logis ini diimplementasikan secara fisik dengan indeks unik. Jika tidak secara eksplisit ditentukan sebaliknya PRIMARY KEY
akan menjadi indeks berkerumun dan batasan 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 di atas, indeks berikut dapat dibuat secara implisit 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 definisi variabel tabel di awal jawaban ini tidak unik indeks tidak berkerumun pada Name
disimulasikan oleh unik indeks pada Name,Id
(ingat bahwa SQL Server akan secara diam-diam menambahkan kunci indeks berkerumun ke kunci NCI yang tidak unik).
Indeks berkerumun yang tidak unik juga dapat dicapai dengan menambahkan IDENTITY
secara manual kolom untuk bertindak sebagai uniqueifier.
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 akurat tentang bagaimana indeks berkerumun non unik biasanya benar-benar diimplementasikan di SQL Server karena ini menambahkan "Uniqueifier" ke semua baris. Bukan hanya mereka yang membutuhkannya.