Soru SQL Server 2000 olarak etiketlendi, ancak en son sürümde gelişen insanların yararına ilk önce bunu ele alacağım.
SQL Server 2014
Aşağıda tartışılan kısıtlamaya dayalı dizinler ekleme yöntemlerine ek olarak, SQL Server 2014'te benzersiz olmayan dizinlerin doğrudan tablo değişkeni bildirimlerinde satır içi sözdizimi ile belirtilmesine izin verir.
Bunun için örnek sözdizimi aşağıdadır.
/*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*/
);
Filtrelenmiş dizinler ve sütunları içeren dizinler şu anda bu sözdizimi ile bildirilemez, ancak SQL Server 2016 bunu biraz daha rahatlatır. CTP 3.1'den artık tablo değişkenleri için filtrelenmiş dizinler bildirmek mümkündür. RTM tarafından o olabilir dahil sütunları da izin verildiğini durum ancak mevcut pozisyon onlar olmasıdır "muhtemel kaynak sıkıntıları nedeniyle SQL16 içine yapmayacağız"
/*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
Ad üzerinde bir dizin oluşturabilir miyim?
Kısa cevap: Evet.
DECLARE @TEMPTABLE TABLE (
[ID] [INT] NOT NULL PRIMARY KEY,
[Name] [NVARCHAR] (255) COLLATE DATABASE_DEFAULT NULL,
UNIQUE NONCLUSTERED ([Name], [ID])
)
Daha ayrıntılı bir cevap aşağıdadır.
SQL Server'daki geleneksel tablolar kümelenmiş bir dizine sahip olabilir veya yığın olarak yapılandırılabilir .
Kümelenmiş dizinler, yinelenen anahtar değerlerine izin vermemek için benzersiz veya varsayılan olmayan benzersiz olarak bildirilebilir. Değil biricik sonra SQL Server sessizce bir eklerse benzersizleştirici herhangi bir yinelenen tuşlara benzersiz yapmak için.
Kümelenmemiş dizinler de açıkça benzersiz olarak bildirilebilir. Aksi takdirde SQL Server , tüm dizin anahtarlarına (yalnızca kopyalar değil) tüm konum anahtarlarına satır bulucuyu (kümelenmiş dizin anahtarı veya yığın için RID ) ekler .
SQL Server 2000 - 2012'de tablo değişkenleri üzerindeki dizinler yalnızca bir UNIQUE
veya PRIMARY KEY
kısıtlama oluşturularak dolaylı olarak oluşturulabilir . Bu kısıtlama türleri arasındaki fark, birincil anahtarın boş değerli olmayan sütunlarda olması gerektiğidir. Benzersiz bir kısıtlamaya katılan sütunlar boş bırakılabilir. (SQL Server'ın NULL
s varlığında benzersiz kısıtlamalar uygulaması SQL Standardında belirtilenlere uygun değildir). Ayrıca bir tablonun yalnızca bir birincil anahtarı olabilir, ancak birden fazla benzersiz kısıtlaması olabilir.
Bu mantıksal kısıtlamaların her ikisi de fiziksel olarak benzersiz bir dizinle uygulanır. Aksi açıkça belirtilmezse PRIMARY KEY
, kümelenmiş dizin ve kümelenmemiş benzersiz kısıtlamalar olur, ancak bu davranış sınırlama bildirimi belirtilerek CLUSTERED
veya NONCLUSTERED
açıkça belirtilerek geçersiz kılınabilir (Örnek sözdizimi)
DECLARE @T TABLE
(
A INT NULL UNIQUE CLUSTERED,
B INT NOT NULL PRIMARY KEY NONCLUSTERED
)
Yukarıdakilerin bir sonucu olarak, SQL Server 2000 - 2012'de tablo değişkenleri üzerinde aşağıdaki dizinler örtük olarak oluşturulabilir.
+-------------------------------------+-------------------------------------+
| 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 |
+-------------------------------------+-------------------------------------+
Sonuncusu biraz açıklama gerektirir. Bu cevabın başlangıcındaki tablo değişkeni tanımında, benzersiz olmayan kümelenmemiş dizin, benzersiz bir dizin Name
tarafından simüle edilir (SQL Server'ın kümelenmiş dizin anahtarını sessizce yine de benzersiz olmayan NCI anahtarına ekleyeceğini hatırlayın).Name,Id
Benzersiz olmayan bir kümelenmiş dizin, benzersizleştirici IDENTITY
olarak işlev görmek üzere manuel olarak bir sütun eklenerek de elde edilebilir.
DECLARE @T TABLE
(
A INT NULL,
B INT NULL,
C INT NULL,
Uniqueifier INT NOT NULL IDENTITY(1,1),
UNIQUE CLUSTERED (A,Uniqueifier)
)
Ancak bu, benzersiz olmayan bir kümelenmiş dizinin normalde SQL Server'da gerçekte nasıl uygulanacağına dair doğru bir simülasyon değildir, çünkü bu, tüm satırlara "Benzersizleştirici" ekler. Sadece ihtiyacı olanlar değil.