Partitioned Table e Primary Key
E'
ormai risaputo: una tabella di database senza la chiave primaria “è
il male assoluto". Ma
allora perchè se creo una tabella partizionata dotata di
Primary Key
CREATE
TABLE [T1]
(
[col1]
[int] PRIMARY
KEY NOT
NULL,
[col2]
[datetime] NOT NULL
)
ON
[ps_T1] ([col2])
SQL
Server 2005 si ostina a dirmi:
Messaggio
1908, livello 16, stato 1, riga 1
'col2'
è una colonna di partizionamento dell'indice
'PK__T1__0EA330E9'. Le colonne di partizione per un indice univoco
devono essere un subset della chiave dell'indice.
Messaggio
1750, livello 16, stato 0, riga 1
Impossibile
creare il vincolo. Vedere gli errori precedenti.
?????????????
La
spiegazione sta nel semplice (ma tacito) fatto che in SQL Server il vincolo di PRIMARY KEY
produce la creazione implicita di un indice unique
clustered che, per essere allineato alla tabella,
necessita della presenza della colonna di partizionamento nell'indice stesso.
Ecco la versione corretta:
CREATE
TABLE [T1]
(
[col1]
[int] NOT
NULL,
[col2]
[datetime] NOT NULL,
CONSTRAINT
PK_T1 PRIMARY KEY
([col1],[col2])
)
ON
[ps_T1] ([col2])
Questo
“disguido” non si verifica invece con gli indici non-unique,
sia essi clustered che non-clustered,
in quanto la colonna di partizionamento viene implicitamente aggiunta
all'indice (per verificarlo basta dare un'occhiata alla
sys.index_columns).