SQL CREATE TABLE: come progettare e creare una tabella su SQL Server

L’istruzione SQL CREATE TABLE è utilizzata per creare una tabella in un database relazionale. Occorre tenere bene a mente che in questo contesto una tabella è molto più di una serie di dati incolonnati. Ciò che distingue nei database relazionali le tabelle è la possibilità di inserire una serie di vincoli che garantiranno quella qualità minima dei dati, necessaria per effettuare in seguito operazioni di analisi.

La corretta progettazione e creazione delle tabelle è dunque un passo fondamentale nella riuscita di ogni progetto informatico, in questo articolo studiamo i principali passi da seguire utilizzando la sintassi del database relazione Microsoft SQL Server.

Come creare una tabella in SQL con CREATE TABLE

Analizziamo il seguente blocco di codice T-SQL che crea una tabella di nome Attori:

CREATE TABLE Attori (
  IdAttore INT IDENTITY(1,1) 
           PRIMARY KEY NOT NULL,
  Nome VARCHAR(50) NOT NULL,
  Cognome VARCHAR(50) NOT NULL,
  DataNascita DATE NULL);

In primo luogo osserviamo che dopo ogni colonna è indicato il relativo tipo. Il tipo di una colonna è in ultima analisi un vincolo: vincoliamo cioè le colonne ad ammettere solo alcune tipologie di dati. Ad esempio in una colonna di tipo int non possiamo inserire un valore che non sia un numero intero. La scelta del tipo di una colonna è dunque un aspetto cruciale per garantire che i dati del database abbiano quella qualità minima necessaria che accennavo nel paragrafo introduttivo.

I tipi utilizzati più frequentemente su SQL Server sono:

  • int per gli interi;
  • varchar(50) per stringhe di lunghezza variabile contenenti fino a 50 caratteri;
  • date per salvare date senza l’indicazione dell’orario;
  • datetime e datetiem2 per date con indicazione dell’ora;
  • decimal(18,4) per numeri decimali con 18 cifre totali di cui al più 4 decimali.

Questa lista vale per il database SQL Server, su altri software possono esserci alcune differenze più o meno importanti. Ad esempio su Oracle il tipo di riferimento per le stringhe è varchar2 e anche il tipo date contiene già l’informazione sull’ora. Per altre differenze tra Oracle e SQL Server puoi leggere questo mio articolo https://www.yimp.it/cinque-differenze-tra-ambiente-oracle-e-sqlserver/

Di fianco al tipo, in ogni una colonna troviamo l’opzione NOT NULL o NULL. Indicare il valore NOT NULL significa garantire che la colonna non potrà mai contenere NULL. Viceversa, specificando NULL, teniamo aperta questa possibilità. Non specificare nessuna delle due opzioni equivale a specificare NULL.

Chiave primaria e proprietà Identity nell’istruzione SQL CREATE TABLE

Inserire un vincolo di chiave primaria su una colonna significa garantire che in quella colonna non potrà mai essere presente lo stesso valore in più di una riga della tabella. Inoltre in una colonna chiave primaria non può essere presente NULL. La chiave primaria può essere definita anche su un insieme di colonne, in questo caso non potrà ripetersi la combinazione di valori presenti in quelle colonne.

È buona norma che ogni tabella abbia una chiave primaria, nel caso in alto questa opzione è specificata per la colonna IdAttore. Su SQL Server è possibile utilizzare più di una sintassi per definire la chiave primaria. Nel caso si tratti di una colonna singola come per la tabella Attori, basta semplicemente aggiungere PRIMARY KEY dopo il tipo.

Nel caso si tratti di più colonne potrò specificare la chiave primaria dopo l’elenco delle colonne, in questo modo

CREATE TABLE Attori (
  IdAttore INT IDENTITY(1,1) NOT NULL,
  Nome VARCHAR(50) NOT NULL,
  Cognome VARCHAR(50) NOT NULL,
  DataNascita DATE NULL,
  PRIMARY KEY (Nome, Cognome));

oppure aggiungere la chiave primaria in uno step successivo alla creazione della tabella, utilizzando l’istruzione ALTER TABLE:

ALTER TABLE Attori
ADD PRIMARY KEY (Nome, Cognome);

“Che cos’è una chiave primaria” è una classica domanda da colloquio, ne puoi trovare altre in questo mio link https://www.yimp.it/storia-di-successo-preparazione-colloquio-di-lavoro-su-sql/

Osserviamo infine che la colonna IdAttore ha anche la proprietà IDENTITY(1,1). Con essa stiamo chiedendo
al database di valorizzare automaticamente quella colonna tramite un numero progressivo che parte da 1 e si incrementa di 1 ad ogni tentativo di inserimento. Puoi leggere un mio approfondimento sulla proprietà IDENTITY a questo link https://www.yimp.it/colonne-identity-su-sql-server/

Vincoli di tipo check su SQL Server

I vincoli check permettono di rafforzare i vincoli di tipo int, varchar, date, eccetera. Anch’essi possono essere definiti direttamente nell’istruzione CREATE TABLE, o successivamente con un’ALTER TABLE. Con il prossimo vincolo ci assicuriamo ad esempio che nel nostro database non entrino righe dove la data di nascita dell’attore sia precedente al 1 gennaio 1950.

ALTER TABLE Attori 
ADD CHECK (DataNascita >= '19500101');

Attenzione a non esagerare col numero di vincoli di questo tipo perché ovviamente avranno un impatto sulle performance delle operazioni di aggiornamento del database. Osserviamo infine che il vincolo in alto permette comunque di inserire righe con DataNascita NULL.

Continua a imparare

Torna in alto
Torna su