back to top

Caricare dati nelle tabelle di MySQL: INSERT, REPLACE e LOAD DATA

Una volta creata la struttura del nostro database ci ritroveremo, ovviamente, con una serie di tabelle vuote. La prima cosa da fare, quindi, sarà quella di inserire dei dati all’interno di queste tabelle. Per fare ciò MySQL ci mette a disposizione diverse possibilità che in questa lezione cercheremo di illustrare.

INSERT

Il costrutto tipico per il caricamento di nuovi dati all’interno di una tabella MySQL è certamente INSERT. Questo tipo di sintassi prevede alcune differenti modalità di utilizzo, vediamole separatamente mediante l’ausilio di alcuni esempi pratici:

INSERT INTO … VALUES

Questa sicuramente è la sintassi tipica per il caricamento di nuovi dati all’interno di una tabella MySQL e prevede, oltre all’indicazione del nome della tabella, l’indicazione facoltativa dei campi in cui inserire i dati e, successivamente, l’indicazione dei dati da inserire in tali campi. Vediamo un esempio ponendo di dover popolare la nostra tabella "amici" così strutturata:

CREATE TABLE amici (
  id INT(20) AUTO_INCREMENT,
  nome VARCHAR(20),
  cognome VARCHAR(20),
  telefono INT(10),
  PRIMARY KEY(id)
);

Di seguito la query per l’inserimento dei dati:

INSERT INTO amici (nome,cognome,telefono) VALUES ('Mario','Rossi','02.123456');

Mediante questa sintassi andremo ad inserire una nuova riga all’interno della nostra tabella "amici" con i valori "Mario" per il campo nome e "Rossi" per il campo cognome.

Questa nuova riga verrà ad assumere, inoltre, il valore 1 per il campo "id" (assegnato in automatico) mentre non verrà valorizzato il campo telefono.

La sintassi INSERT INTO, come detto, consente di omettere l’indicazione dei campi che si desidera riempire, in tal caso sarà necessario prevedere un valore per ciascuno dei campi presenti nella tabella avendo cura di rispettarne l’ordine.

INSERT INTO amici VALUES ('','Mario','Rossi','123456789');

Nel nostro caso abbiamo passato un valore vuoto per il campo "id" in quanto, essendo auto-incrementale, si popola da se con giusto valore numerico.

INSERT INTO … SET

Una sintassi meno conosciuta ed utilizzata è quella che prevede di utilizzare il comando INSERT INTO in comunione con la clausola SET, in questo modo:

INSERT INTO amici SET nome = 'Mario', cognome = 'Rossi';

Da un punto di vista funzionale non vi è alcuna differenza con l’istruzione basata su INSERT INTO … VALUES.

INSERT INTO … SELECT

Un modo particolare di popolare le tabelle prevede di utilizzare il comando INSERT INTO in comunione con il comando SELECT: così facendo, in poche parole, viene popolato una tabella inserendo dei dati estratti da una seconda tabella. Vediamo un esempio:

INSERT INTO amici (nome, cognome)
SELECT nome, cognome FROM parenti;

Nell’esempio qui sopra abbiamo immaginato di popolare di dati la tabella "amici" inserendo automaticamente i dati già presenti in un’ipotetica tabella "parenti".

INSERT IGNORE INTO …

Il comando insert può essere modificato nel suo comportamento di default mediante l’inserimento di alcune keywords, tra cui IGNORE. Aggiungendo questa parola dopo il comando INSERT si invita il DBMS a non mostrare errori nel caso si cerchi di inserire un valore duplicato per un campo PRIMARY KEY o UNIQUE. Qualora ciò accada, semplicemente, MySQL ignorerà il comando.

INSERT IGNORE INTO amici
VALUES (1,'Mario','Rossi','123456789');

INSERT … ON DUPLICATE KEY

La clausola ON DUPLICATE KEY serve a regolare situazioni analoghe a quelle appena "ignorate". Mediante questa sintassi si chiede al DBMS di effettuare una specifica operazione qualora, in sede di INSERT, si stia cercando di caricare dati duplicati per chiavi primarie o uniche. Vediamo un esempio di istruzione SQL:

INSERT INTO amici VALUES (1,'Luca','Verdi','987654321')
ON DUPLICATE KEY
UPDATE nome = 'Luca', cognome = 'Verdi', telefono = 987654321;

In pratica, qualora la chiave primaria sia già occupata invece di procedere ad una INSERT, MySQL effettuerà un UPDATE dei dati.

REPLACE

Il comando REPLACE in MySQL è un’estensione dello standard SQL. Utilizzando REPLACE al posto di INSERT, MySQL quelle effettuerà la sostituzione dei dati qualora siano già presenti all’interno del database, qualora invece non siano presenti effettuerà una normale operazione di inserimento.

REPLACE INTO amici VALUES ('1','Mario','Rossi','123456789');

Come potete vedere la sintassi è la medesima di INSERT.

Da un punto di vista tecnico è da segnalare REPLACE non effettua un UPDATE del record ma procederà alla cancellazione del record precedente ed all’inserimento di un nuovo record (per questo motivo questa query restituirà "Affected rows: 2").

LOAD DATA … INTO

Il comando LOAD DATA consente di caricare, in modo molto veloce, grandi volumi di dati all’interno di una tabella MySQL prelevandoli da un file di testo (normalmente un file .CSV).

Supponiamo quindi di avere un file "amici.csv" contenente i dati da importare all’interno dell’omonima tabella su MySQL:

LOAD DATA INFILE 'c:/amici.csv' 
INTO TABLE amici 
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS

Come potete vedere, all’interno del nostro comando abbiamo specificato:

  • il percorso fisico del file .CSV da utilizzare come sorgente;
  • il nome della tabella in cui importare i dati (dopo INTO TABLE);
  • che i campi, all’interno del file sorgente, sono separati con una virgola;
  • che ogni valore è racchiuso tra virgolette;
  • che ogni record termina con un ritorno a capo (\n);
  • che la prima linea del file è da ignorare (ad esempio perchè contiene i nomi dei campi).

CREATE TABLE … SELECT

Per concludere questa lezione accenniamo, infine, alla possibilità di creare delle tabelle già popolate di dati. Ciò è possibile mediante l’uso congiunto dei comandi CREATE TABLE e SELECT. Col primo, ovviamente, si crea la tabella, col secondo si caricano al suo interno i dati prelevati da una seconda tabella. Il suo funzionamento, in pratica, è analogo a quello di INSERT INTO … SELECT.

Vediamo la sintassi:

CREATE TABLE amici (
  id INT(20) AUTO_INCREMENT,
  nome VARCHAR(20),
  cognome VARCHAR(20),
  telefono INT(10),
  PRIMARY KEY(id)
) SELECT nome, cognome, telefono FROM parenti;
Pubblicitร 
Massimiliano Bossi
Massimiliano Bossi
Stregato dalla rete sin dai tempi delle BBS e dei modem a 2.400 baud, ho avuto la fortuna di poter trasformare la mia passione in un lavoro (nonostante una Laurea in Giurisprudenza). Adoro scrivere codice e mi occupo quotidianamente di comunicazione, design e nuovi media digitali. Orgogliosamente "nerd" sono il fondatore di MRW.it (per il quale ho scritto centinaia di articoli) e di una nota Web-Agency (dove seguo in prima persona progetti digitali per numerosi clienti sia in Italia che all'estero).

In questa guida...