Primary Key, Indici e falsi miti
sfatiamo un mito...se ce ne fosse ancora bisogno:
a) l'indice clustered può non coincidere con la chiave primaria
b) l'indice clustered può essere non-univoco
c) la/e colonne indicizzate possono ammettere il valore NULL
'indice' e 'chiave primaria' sono due concetti completamente distinti fra loro:
- la chiave primaria è un vincolo che assicura l'univocità di ogni riga della tabella
- un indice clustered è un struttura B+Tree allocata nel file di dati che determina un ordinamento specifico dei dati della tabella nelle pagine di dati
il falso mito è alimentato dal fatto che MS-SQL Server implementa il vincolo di chiava primaria attraverso un 'unique index', in particolare questo indice sarà 'clustered' a meno che
1) creaiamo prima la tabella senza chiave primaria
create table T1 (
col1 int not null,
col2 nvarchar(30) null,
)
go
2) quindi l'indice clustered
create clustered index IX_Clustered on T1 (col2)
go
3) infine aggiungiamo il vincolo di chiave primaria
alter table T1
add constraint PK_T1 primary key (col1)
go
4) proviamo a vedere se quanto detto è vero:
insert t1 (col1, col2) values (0, 'Biagio')
insert t1 (col1, col2) values (1, 'Peppino')
insert t1 (col1, col2) values (2, 'Giacinto')
insert t1 (col1, col2) values (3, 'Peppino')
insert t1 (col1, col2) values (4, NULL)
insert t1 (col1, col2) values (5, NULL)
select * from t1 where col2 = 'Peppino'
go
5) sbirciamo fra gli indici della tabella T1
sp_helpindex T1
go
index_name: IX_Clustered
index_description: clustered located on PRIMARY
index_keys: col2
-------------------------------------------------------
index_name: PK_T1
index_description: nonclustered, unique, primary key located on PRIMARY
index_keys: col1
-------------------------------------------------------
come si può vedere la chiave primaria è stata implementata attraverso un indice non-clustered.