Dopo aver creato un database con Node.js, il passo successivo è creare le tabelle al suo interno. Le tabelle sono la struttura fondamentale di MySQL: contengono righe e colonne in cui vengono salvati i dati del nostro sito web.
Con Node.js possiamo creare tabelle mediante query SQL, definendo le colonne e i loro tipi di dato.
Una tabella in MySQL è composta da:
Per creare una tabella in MySQL tramite Node.js, utilizziamo sempre con.query() con l'istruzione CREATE TABLE.
Con CREATE TABLE si deve definire il nome della tabella e le diverse colonne che contiene. Per ogni colonna, a sua volta, si deve scegliere il tipo di dato (numero, testo, data, ...) e le relative proprietà.
Vediamo un esempio:
const mysql = require("mysql");
const con = mysql.createConnection({
host: "localhost",
user: "root",
password: "la_tua_password",
database: "esempio"
});
con.connect(function (err) {
if (err) throw err;
const sql = "CREATE TABLE utenti (id INT AUTO_INCREMENT PRIMARY KEY, nome VARCHAR(255), email VARCHAR(255));";
con.query(sql, function (err, result) {
if (err) throw err;
console.log("Tabella creata correttamente");
});
});Nell'esempio:
database: "esempio" per connetterci direttamente al database che vogliamo utilizzare (che avevamo creato nella lezione precedente).utenti con tre colonne: id, nome ed email.id INT AUTO_INCREMENT PRIMARY KEY crea una colonna numerica che parte da 1 e si incrementa automaticamente, fungendo da chiave primaria (ovvero l'identificatore univoco della riga).nome VARCHAR(255) crea una colonna di testo con lunghezza massima di 255 caratteri.email VARCHAR(255) crea un'altra colonna di testo per l'indirizzo email.Quando creiamo una tabella, dobbiamo specificare il tipo di dato per ogni colonna. Ecco i principali tipi disponibili:
| Tipo | Descrizione |
INT | Numero intero. |
VARCHAR(n) | Stringa di testo con lunghezza massima n. |
TEXT | Stringa di testo lungo (fino a 65.535 caratteri). |
DATE | Data nel formato YYYY-MM-DD. |
DATETIME | Data e ora nel formato YYYY-MM-DD HH:MM:SS. |
DECIMAL(p,s) | Numero decimale con p cifre totali e s dopo la virgola. |
BOOLEAN | Valore vero o falso (salvato come 0 o 1). |
Se, ad esempio, vogliamo salvare un login di un utente, possiamo creare una nuova tabella login che salvi l'orario esatto e un valore booleano che indichi se il login è avvenuto con successo. Ecco un esempio:
con.connect(function (err) {
if (err) throw err;
const sql = `CREATE TABLE login (
id INT AUTO_INCREMENT PRIMARY KEY,
data DATETIME,
login_avvenuto BOOLEAN
);`;
con.query(sql, function (err, result) {
if (err) throw err;
console.log("Tabella creata correttamente");
});
});La chiave primaria (PRIMARY KEY) è una colonna speciale che identifica in modo univoco ogni riga della tabella. Di solito si usa una colonna numerica con AUTO_INCREMENT, che si incrementa automaticamente a ogni nuovo inserimento.
const sql = `CREATE TABLE prodotti (
id INT AUTO_INCREMENT PRIMARY KEY,
nome VARCHAR(100),
prezzo DECIMAL(10,2)
);`;In questo esempio, id è la chiave primaria e si incrementa automaticamente. Ogni prodotto avrà un ID univoco.
Ora vediamo le istruzioni più importanti durante la creazione di nuove tabelle.
Tutte le tabelle di un database non possono avere lo stesso nome. Per evitare errori quando si prova a creare una tabella che esiste già, possiamo usare IF NOT EXISTS:
const sql = `CREATE TABLE IF NOT EXISTS utenti (
id INT AUTO_INCREMENT PRIMARY KEY,
nome VARCHAR(255),
email VARCHAR(255)
);`;
con.query(sql, function (err, result) {
if (err) throw err;
console.log("La tabella esiste già o è stata creata");
});Con IF NOT EXISTS, MySQL crea la tabella solo se non esiste già, evitando errori.
Possiamo aggiungere vincoli alle colonne per controllare i dati inseriti. Ad esempio:
NOT NULL: la colonna non può essere vuota.UNIQUE: ogni valore nella colonna deve essere unico e non può ripetersi in altre righe.DEFAULT: imposta un valore assegnato automaticamente se non viene specificato durante l'inserimento dei dati nella tabella.Vediamo un esempio:
const sql = `CREATE TABLE utenti (
id INT AUTO_INCREMENT PRIMARY KEY,
nome VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL UNIQUE,
data_iscrizione DATE DEFAULT (CURRENT_DATE)
);`;
con.query(sql, function (err, result) {
if (err) throw err;
console.log("Tabella con vincoli creata");
});Nell'esempio:
nome e email devono sempre avere un valore (NOT NULL).email deve essere unica per ogni utente (UNIQUE), perché non devono esserci due utenti con la stessa email.data_iscrizione ha come valore predefinito la data corrente (CURRENT_DATE).Per creare più tabelle in sequenza, possiamo concatenare le query o utilizzare più chiamate a con.query():
con.connect(function (err) {
if (err) throw err;
const tabella1 = "CREATE TABLE IF NOT EXISTS categorie (id INT AUTO_INCREMENT PRIMARY KEY, nome VARCHAR(100));";
const tabella2 = "CREATE TABLE IF NOT EXISTS prodotti (id INT AUTO_INCREMENT PRIMARY KEY, nome VARCHAR(100), categoria_id INT);";
con.query(tabella1, function (err, result) {
if (err) throw err;
console.log("Tabella categorie creata");
con.query(tabella2, function (err, result) {
if (err) throw err;
console.log("Tabella prodotti creata");
});
});
});In questo modo creiamo prima la tabella categorie e poi la tabella prodotti.