La domanda è taggata SQL Server 2000 ma a beneficio delle persone che sviluppano sull'ultima versione mi occuperò prima di tutto.
SQL Server 2014
Oltre ai metodi di aggiunta degli indici basati sui vincoli discussi di seguito in SQL Server 2014, è anche possibile specificare indici non univoci direttamente con la sintassi incorporata nelle dichiarazioni delle variabili di tabella.
La sintassi di esempio è sotto.
/*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*/
);
Gli indici filtrati e gli indici con colonne incluse non possono attualmente essere dichiarati con questa sintassi, tuttavia SQL Server 2016 lo rilassa ulteriormente. Da CTP 3.1 è ora possibile dichiarare indici filtrati per variabili di tabella. Con RTM può accadere che anche le colonne incluse siano consentite, ma la posizione attuale è che "probabilmente non lo faranno in SQL16 a causa di vincoli di risorse"
/*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
Posso creare un indice su Nome?
Risposta breve: Sì.
DECLARE @TEMPTABLE TABLE (
[ID] [INT] NOT NULL PRIMARY KEY,
[Name] [NVARCHAR] (255) COLLATE DATABASE_DEFAULT NULL,
UNIQUE NONCLUSTERED ([Name], [ID])
)
Una risposta più dettagliata è di seguito.
Le tabelle tradizionali in SQL Server possono avere un indice cluster o sono strutturate come heap .
Gli indici cluster possono essere dichiarati come univoci per impedire valori di chiave duplicati o per impostazione predefinita su non univoci. Se non univoco, SQL Server aggiunge silenziosamente un identificatore a qualsiasi chiave duplicata per renderli univoci.
Gli indici non cluster possono anche essere dichiarati esplicitamente come univoci. In caso contrario, per il caso non univoco, SQL Server aggiunge il localizzatore di righe (chiave di indice cluster o RID per un heap) a tutte le chiavi di indice (non solo ai duplicati), in modo da garantire che siano univoci.
In SQL Server 2000 - 2012 gli indici sulle variabili di tabella possono essere creati in modo implicito solo creando un vincolo UNIQUE
o PRIMARY KEY
. La differenza tra questi tipi di vincoli è che la chiave primaria deve trovarsi su colonne non annullabili. Le colonne che partecipano a un vincolo univoco potrebbero essere nullable. (sebbene l'implementazione di SQL Server di vincoli univoci in presenza di NULL
s non sia conforme a quella specificata nello standard SQL). Inoltre, una tabella può avere solo una chiave primaria ma più vincoli univoci.
Entrambi questi vincoli logici sono implementati fisicamente con un indice univoco. Se non specificato esplicitamente, altrimenti PRIMARY KEY
diventerà l'indice cluster e i vincoli univoci non cluster ma questo comportamento può essere ignorato specificando CLUSTERED
o NONCLUSTERED
esplicitamente con la dichiarazione di vincolo (sintassi di esempio)
DECLARE @T TABLE
(
A INT NULL UNIQUE CLUSTERED,
B INT NOT NULL PRIMARY KEY NONCLUSTERED
)
Di conseguenza, i seguenti indici possono essere implicitamente creati su variabili di tabella in 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 |
+-------------------------------------+-------------------------------------+
L'ultimo richiede un po 'di spiegazione. Nella definizione della variabile di tabella all'inizio di questa risposta, l' indice non cluster non univoco attivo Name
è simulato da un indice univoco attivato Name,Id
(ricordare che SQL Server aggiungerebbe silenziosamente la chiave di indice cluster alla chiave NCI non univoca).
Un indice cluster non univoco può anche essere ottenuto aggiungendo manualmente una IDENTITY
colonna per fungere da unificatore univoco.
DECLARE @T TABLE
(
A INT NULL,
B INT NULL,
C INT NULL,
Uniqueifier INT NOT NULL IDENTITY(1,1),
UNIQUE CLUSTERED (A,Uniqueifier)
)
Ma questa non è una simulazione accurata di come un indice cluster non univoco verrebbe effettivamente implementato in SQL Server in quanto ciò aggiunge "Uniqueifier" a tutte le righe. Non solo quelli che lo richiedono.