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. MySQL ci mette a disposizione diverse possibilità per raggiungere questo obiettivo, che illustreremo in dettaglio in questa lezione.

INSERT

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

Pubblicità

INSERT INTO … VALUES

Questa è la sintassi tipica per il caricamento di nuovi dati all’interno di una tabella MySQL. Essa 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. Immaginiamo di dover popolare una tabella chiamata amici, così strutturata:

CREATE TABLE amici (
  id INT(20) AUTO_INCREMENT,
  nome VARCHAR(20),
  cognome VARCHAR(20),
  telefono VARCHAR(15),
  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 a 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 assumerà, inoltre, il valore 1 per il campo id (assegnato automaticamente), 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, rispettandone l’ordine.

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

In questo caso, abbiamo passato un valore vuoto per il campo id in quanto, essendo auto-incrementale, si popola da solo con il giusto valore numerico.

INSERT INTO … SET

Una sintassi meno conosciuta ma utile è quella che prevede di utilizzare il comando INSERT INTO in combinazione con la clausola SET. Così facendo:

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 combinazione con il comando SELECT: in questo modo, una tabella viene popolata inserendo 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 la tabella amici con 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 della keyword IGNORE. Aggiungendo questa parola dopo il comando INSERT, si invita il DBMS a non visualizzare errori nel caso in cui 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 viene utilizzata per gestire situazioni simili a quelle descritte in precedenza. Mediante questa sintassi, si richiede al DBMS di effettuare una specifica operazione nel caso in cui, durante un INSERT, si stia tentando 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 con un 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 procederà a sostituire i dati qualora siano già presenti nel database; se non sono presenti, verrà effettuata una normale operazione di inserimento.

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

Come si può vedere, la sintassi è identica a quella di INSERT.

Dal punto di vista tecnico, è rilevante sottolineare che REPLACE non esegue un UPDATE del record, ma piuttosto cancella il record precedente e inserisce un nuovo record. Per questa ragione, 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 si può notare, 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 da 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. Con CREATE TABLE si crea la tabella, mentre con SELECT si caricano al suo interno i dati prelevati da una seconda tabella. Il suo funzionamento è 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 VARCHAR(15),
  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...