Nella lezione precedente abbiamo visto come creare le tabelle e definire le regole che i dati devono rispettare, utilizzando tipi di dato e vincoli come PRIMARY KEY, UNIQUE, NOT NULL e FOREIGN KEY.
Ora vediamo come inserire dati nelle tabelle utilizzando INSERT.
Per inserire una nuova riga in una tabella utilizziamo INSERT INTO.
Per esempio, supponiamo di avere una tabella utenti, con colonne id, nome e email. Possiamo inserire un nuovo utente usando la query:
INSERT INTO utenti (nome, email) VALUES ('Marco', '[email protected]');In una query INSERT INTO è necessario specificare tra parentesi i nomi delle colonne in cui inserire i dati, seguiti dai rispettivi valori. L'ordine deve corrispondere: il primo valore viene assegnato alla prima colonna, il secondo alla seconda e così via.
Quando una colonna viene definita con l'attributo AUTO_INCREMENT, non è necessario specificare manualmente il suo valore nell'INSERT.
Ad esempio, nel caso in cui id viene definito così:
id INT AUTO_INCREMENT PRIMARY KEYMySQL assegnerà automaticamente il successivo valore disponibile. Potremmo comunque specificare id manualmente, ma normalmente non è necessario e, per le chiavi primarie generate automaticamente, è preferibile lasciare che sia MySQL a gestirlo.
Se una colonna ha un valore predefinito tramite DEFAULT, possiamo ometterla dall'INSERT. Per esempio, se la tabella è stata creata con la seguente query:
CREATE TABLE utenti (
id INT AUTO_INCREMENT PRIMARY KEY,
nome VARCHAR(100) NOT NULL,
attivo BOOLEAN DEFAULT TRUE
);Possiamo inserire un utente senza specificare attivo:
INSERT INTO utenti (nome) VALUES ('Marco');Se una colonna permette valori NULL, possiamo inserire esplicitamente NULL:
INSERT INTO utenti (nome, email) VALUES ('Marco', NULL);Possiamo inserire più righe con una sola istruzione INSERT, specificando una sola volta le colonne in cui vogliamo inserire i nuovi dati.
Ad esempio, possiamo scrivere:
INSERT INTO utenti (nome, email)
VALUES
('Marco', '[email protected]'),
('Andrea', '[email protected]'),
('Luca', '[email protected]');In questo modo vengono inserite tre righe utilizzando una sola istruzione SQL. Questo approccio viene chiamato batch insert o inserimento multiplo.
Con un batch insert vengono ridotti i passaggi necessari tra applicazione e database e, quando l'inserimento è gestito all'interno di una transazione, possiamo anche trattare l'insieme delle operazioni come un'unica unità di lavoro. Questo può essere particolarmente vantaggioso quando dobbiamo inserire centinaia o migliaia di righe.
Non siamo obbligati a specificare i valori direttamente con VALUES. Possiamo anche utilizzare il risultato di un'altra query, semplicemente specificando il nome in FROM.
Vediamo un esempio:
INSERT INTO utenti_archiviati (nome, email)
SELECT nome, email
FROM utenti
WHERE attivo = FALSE;Nell'esempio, SELECT individua gli utenti inattivi, poi INSERT INTO inserisce i dati ottenuti nella tabella utenti_archiviati. Non è quindi necessario recuperare prima i dati nell'applicazione e poi inserirli nuovamente con una serie di INSERT.
Immaginiamo di avere una colonna email definita come UNIQUE:
email VARCHAR(255) UNIQUESe proviamo a inserire un utente con un'email già presente, MySQL rileverà una violazione del vincolo UNIQUE e, con un normale INSERT, restituirà un errore:
INSERT INTO utenti (nome, email)
VALUES ('Marco', '[email protected]');ON DUPLICATE KEY UPDATE permette di aggiornare una riga esistente invece di generare un errore quando l'inserimento viola una chiave PRIMARY KEY o UNIQUE.
Per esempio, supponiamo di avere:
CREATE TABLE utenti (
id INT AUTO_INCREMENT PRIMARY KEY,
email VARCHAR(255) UNIQUE,
nome VARCHAR(100)
);Possiamo utilizzare:
INSERT INTO utenti (email, nome)
VALUES ('[email protected]', 'Marco') AS new
ON DUPLICATE KEY UPDATE
nome = new.nome;Se l'email non esiste, viene creato un nuovo utente; se invece esiste già, viene aggiornato il nome.
Nota: vedremo meglio UPDATE nelle lezione sul modificare dei dati in SQL.
MySQL mette a disposizione anche REPLACE INTO, che funziona in questo modo:
REPLACE si comporta sostanzialmente come un normale inserimento.PRIMARY KEY o con un indice UNIQUE, MySQL elimina la riga esistente e inserisce una nuova riga.Ad esempio:
REPLACE INTO utenti (nome, email)
VALUES ('Marco', '[email protected]');INSERT IGNORE permette di inserire i valori nella tabella, ignorando gli errori causati dalle violazioni dei vincoli e continuando l'esecuzione della query senza interromperla.
Ad esempio:
INSERT IGNORE INTO utenti (nome, email)
VALUES ('Marco', '[email protected]');Se l'email esiste già, l'INSERT non inserirà una seconda riga con la stessa email.