Babbo Natale e gli indici univoci filtrati

Buongiorno a tutti!

Anche per oggi ben ritrovati.

Si sa anche Babbo natale per gestire la sua attività di consegna regali natalizi ai bambini ricorre ad una applicazione che memorizza i dati su di un database.
Non per un discorso di tracciabilità per carità, piuttosto, data la sua veneranda età, per un problema di memoria.
Riveleremo oggi, qui, ora, ed in anteprima mondiale che il beniamino di tutti i bambini utilizza nientedimenochè che SQL Server di Microsoft.

Ora sul suo server ben raffreddato dai ghiacci del polo nord è presente un database davvero molto semplice:

Una tabella Bambini (master) con il nome e l'indirizzo di tutti i bambini del mondo.
Una tabella Giochi (master) con l'elenco di tutti di giochi del mondo (attenzione ....nessuno escluso)
Infine una tabella Regali di dettaglio dove memorizzare, anno per anno, quale regalo ha ricevuto il bambino.

Ecco qua (sempre in anteprima mondiale) la struttura del suo database:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

A dispetto della sua veneranda età il vulcanico Santa Claus quest'anno si è poi messo in testa di dare ad ogni bambino un regalo differente!

E proprio per questo motivo mi ha scritto una missiva chiedendomi, fortunatamente per tempo, informazioni su come realizzare quanto desiderato.

A proposito, mi ha anche accennato al fatto che non vorrebbe toccare l'applicazione dato che funziona perfettamente e anche perchè come è risaputo gli elfi, per quanto bravi a fabbricare giocattoli, non lo sono altrettanto nel modificare e ricompilare applicazioni.

La redazione di "The SQLServer Performance Blog" ha quindi alacremente prerarato una lettera di risposta che inzia pressapoco così:

Carissimo Babbo Natale,

La soluzione è davvero semplice e soprattutto nessuna modifica al programma si renderà necessaria.
Per risolvere la sua richiesta sarà sufficiente creare un indice univoco nella tabella Regali sul campo idgioco.


(...Già, direte voi a cui nulla scappa:
Funzionerebbe bene se il campo idgioco venisse sempre valorizzato.
Altrimenti potrò avere un solo record con il campo idgioco non valorizzato.
Avete ragione ...non vi scappa proprio nulla! Io però non avevo finito la lettera..)

L'indice univoco dovrà essere filtrato.

Per creare un indice filtrato è sufficiente aggiungere alla fine della definizione una clausola WHERE ed una condizione.

Ad esempio così:

CREATE UNIQUE INDEX IDX_REGALI_IDGIOCO ON REGALI(IDGIOCO) WHERE IDGIOCO IS NOT NULL ; 

In questo modo si potrà lasciare il campo IDGIOCO all'occorrenza non valorizzato.

Si ricordi solamente di verificare se nella connessione è impostatato la proprietà ANSI_NULLS con valore TRUE.
Altrimenti non sarà possibile applicare quanto detto perchè verrebbe generato un errore al primo insert!


Cordialmente,
The SQLServer Performance Blog




Alla prossima!

Luca Biondi @ SQLServerPerformance blog!








Next post:Le Common Table Expression (CTE) che cosa sono?

Previous post:Identificare la versione di SQL server? Semplice!



Comments

I Post più popolari

SQL Server, execution plan and the lazy spool (clearly explained)

SQL Server, datetime vs. datetime2

La clausola NOLOCK. Approfondiamo e facciamo chiarezza!