I vincoli

I vincoli sono dei controlli che vengono implementati in una o più colonne di una tabella. Esistono diverse tipologie di vincolo: vincoli di chiave, per il controllo di unicità o per il semplice controllo di null.

Vincoli di chiave primaria

Il vincolo di chiave primaria è il più importante poiché è l’unico in grado di contrassegnare l’unicità del recordset, per la tabella. Un vincolo di c.p. può essere costituito da una o più colonne, ma ne può esistere solo uno per ogni tabella.

Una chiave primaria deve essere breve e semplice. Breve perché non deve occupare troppo spazio e non deve essere difficile da implementare. Semplice perché deve essere facile da memorizzare e da visualizzare. Pensate ad un semplice campo int che si incrementa di 1 ad ogni record e ad un varchar(20) per codice bancario random… naturalmente l’int è più efficace.

Listato 1. Creazione di un vincolo di chiave primaria composto da 3 colonne

ALTER TABLE [dbo].[ANAGRAFICA]
ADD CONSTRAINT [PK__ANAGRAFICA] PRIMARY KEY CLUSTERED(
ANA_ID ASC,
ANA_NOME ASC,
ANA_COGNOME ASC
)

Con questo codice abbiamo detto a SQL Server di creare un indice di chiave primaria e di legarlo con i 3 campi: ID, nome e cognome.

In questo caso basterebbe vincolare il campo ID e renderlo IDENTITY, ovvero in grado di incrementarsi da solo. Occuperemmo meno memoria e il motore di database renderebbe di più.

Vincoli di chiave esterna

Si tratta di un vincolo tra uno o più campi chiave di una tabella, con campi di un’altra tabella. La tabella che detiene la chiave primaria sarà alla sinistra, mentre la chiave esterna la possiamo trovare in tutti i record presenti nella tabella di destra, che fanno riferimento alla chiave primaria.

Nel caso di un database di produzione non sarebbe possibile cancellare la chiave primaria (Es: anagrafica) perché troveremmo le chiavi esterne (Es: ordini) che vincolano questo relazione.

Listato 2. Vincolo di chiave esterna, aggiunge una referenza esterna

ALTER TABLE dbo.ANAGRAFICA
ADD CONSTRAINT
FK_ANAGRAFICA_ORDINI FOREIGN KEY ( ANA_ID )
REFERENCES dbo.ORDINI ( ORD_ID )
ON UPDATE NO ACTION
ON DELETE NO ACTION
GO

Vincoli predefiniti

Vengono a crearsi quando è SQL Server che assegna un valore, calcolato o fisso, a un determinato campo. Possiamo, ad esempio, avere un campo di tipo dateTime che deve sempre avere come valore la data di creazione record. Potremmo in quel caso assegnare un valore GETDATE().

La colonna di tipo identity (autoincrementa) per ovvi motivi non può essere un vincolo predefinito.

Listato 3. Creazione di un vincolo predefinito che carica la data corrente

ALTER TABLE dbo.ANAGRAFICA
ADD CONSTRAINT
DF_ANAGRAFICA_ANA_CAP DEFAULT getdate() FOR ANA_CAP

Vincolo non null

Forse una delle caratteristiche principali di un campo, spesso sottovalutata è se deve ammettere valori NULL o no.

Questa caratteristica se non viene ben progettata può creare grossi grovigli di righe di dati vuoti, utili solamente a rallentare la velocità del database. Quindi, un vincolo non null è un vincolo che non consente l’immissione di un valore vuoto (NULL) in una colonna. Per rendere una colonna in grado di accettare valori null si usa: ALTER COLUMN [COLONNA] NULL anziché ALTER COLUMN [COLONNA] NOT NULL.

Vincolo check (di controllo)

Simile al vincolo predefinito, anche il vincolo di tipo check controlla che l’immisione di un dato in una colonna, appartenga ad un certo range di valori.

Listato 4. Vincolo CHECK con varie tipologie

ALTER TABLE dbo.ANAGRAFICA
ADD CONSTRAINT CK_ANAGRAFICA CHECK (ANA_CAP IN (’21100′, ’21150′, ’21130′))

/*Vincolo CHECK per la data di nascita minore di oggi*/
ALTER TABLE dbo.ANAGRAFICA
ADD CONSTRAINT CK_NASCITA CHECK (ANA_ANNO_NASCITA < GETDATE())

Bisogna tener presente che più vincoli aggiungiamo al database più difficile sarà l’immisione dei dati da parte dell’utente. Quindi i vincoli check sono molto utili per la validità dei dati ma limitano le possibilità di inserimento.

Vincoli unique

Una colonna si definisce unique, ovvero unica, quando ogni voce che contiene è unica per tutta la tabella. Per esempio il campo username con vincolo unique permette l’inserimento di un solo valore “pippo”. Questo campo è molto utile per evitare ridondanze di dati.

Anche la Primary Key ha lo stesso funzionamento ma a differenza di questa, si possono inserire più colonne unique in una tabella.

Listato 5. Inserisce un vincolo unique

ALTER COLUMN [COLONNA] UNIQUE NONCLUSTERED

Vincoli identity, colonne con autoincremento

Una delle caratteristiche più usate, nella creazione di chiavi primarie ed indici, è la capacità di una colonna di autoincrementare il proprio valore per ogni nuovo record inserito. In questo modo non dobbiamo inventare codici univoci o algoritmi random per la creazione di GUID ma ogni record avrà il suo numero int.

Una colonna identity è composta dal suo valore iniziale e dal seme (indice di incremento) che normalmente vale 1. Possiamo anche incrementare il valore di una colonna identity di 10 unità alla volta.

Listato 5. Colonna identity

ADD COLUMN [NOMECOLONNA] int IDENTITY(1,1)

Both comments and pings are currently closed.

Comments are closed.