star gate Partitioned Table e Primary Key - Francesco Quaratino

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).

Comments

No Comments