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;