Inserimento dei dati nelle tabelle

L’inserimento dei dati in una tabella avviene tramite l’istruzione INSERT. Ovviamente dovremo avere il permesso di INSERT sulla tabella.

Vediamo quali sono le diverse sintassi che possiamo utilizzare:

INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
[INTO] nome_tabella [(nome_colonna,...)]
VALUES ({espressione | DEFAULT},…),(…),…
[ ON DUPLICATE KEY UPDATE nome_colonna=espressione, ... ]

Con questa sintassi possiamo inserire una o più righe nella tabella. Prima della clausola VALUES è possibile indicare i nomi delle colonne interessate dalla INSERT: a questi nomi corrisponderanno i valori compresi in ogni parentesi dopo VALUES. Per inserire più righe useremo più coppie di parentesi tonde dopo VALUES. Se non indichiamo la lista delle colonne, dovremo fornire un valore per ogni colonna della tabella, nell’ordine in cui sono definite.

INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
[INTO] nome_tabella
SET nome_colonna={espressione | DEFAULT}, …
[ ON DUPLICATE KEY UPDATE nome_colonna=espressione, ... ]

In questo caso usiamo la clausola SET per assegnare esplicitamente un valore ad ogni colonna indicata. Con questa sintassi è possibile inserire una sola riga.

INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]
[INTO] nome_tabella [(nome_colonna,...)]
SELECT …
[ ON DUPLICATE KEY UPDATE nome_colonna=espressione, ... ]

Qui utilizziamo direttamente una SELECT per fornire i valori alla nuova tabella. Con questo sistema si possono inserire più righe. Come nel primo caso, è possibile elencare le colonne interessate; in caso contrario la SELECT dovrà fornire valori per tutte le colonne.

Vediamo ora la funzione delle varie clausole utilizzabili:

LOW PRIORITY: l’inserimento non viene effettuato fino a quando esistono client che leggono sulla tabella interessata; questo può portare ad attese anche lunghe.

DELAYED: anche in questo caso l’inserimento viene ritardato fino a quando la tabella non è libera. La differenza rispetto al caso precedente è che al client viene dato immediatamente l’ok, e le righe da inserire vengono mantenute in un buffer gestito dal server fino al momento della effettiva scrittura. Ovviamente le righe non saranno visibili con una SELECT fino a quando non saranno inserite sulla tabella.

HIGH PRIORITY: annulla l’effetto di una eventuale opzione –low-priority-updates che fosse attiva sul server.

IGNORE: permette di gestire eventuali errori che si verificano in fase di inserimento (chiavi duplicate o valori non validi); invece di generare errori bloccanti, i record con chiavi doppie vengono semplicemente scartati, mentre i valori non validi vengono “aggiustati” al valore più prossimo.

ON DUPLICATE KEY UPDATE: nel caso in cui si verifichi una chiave doppia, l’istruzione specificata viene eseguita sulla riga preesistente. Con questa opzione non è possibile usare DELAYED.

valori da inserire nella tabella con le prime due sintassi possono essere indicati da costanti o espressioni, oppure richiamando esplicitamente il DEFAULT. Il default viene usato anche per le colonne non specificate. Tuttavia, in strict mode, è obbligatorio specificare valori per tutte le colonne che non hanno un default esplicito; in caso contrario si avrà un errore.

Le colonne di tipo AUTO_INCREMENT vengono valorizzate automaticamente indicando NULL (oppure tralasciandole). Per conoscere il valore generato si può usare, dopo l’inserimento, la funzione LAST_INSERT_ID(), che restituisce l’ultimo valore creato nel corso della connessione attuale.

Oltre alla INSERT, MySQL offre l’istruzione REPLACE, che è un’estensione allo standard SQL e che consente di sostituire le righe preesistenti con le righe inserite qualora si verifichi una situazione di chiave doppia. In pratica, usando REPLACE, qualora non sia possibile inserire una riga perchè una PRIMARY KEY o un indice UNIQUE esistono già sulla tabella, MySQL cancella la riga vecchia ed inserisce la nuova. Questo comportamento è opposto a quello di INSERT IGNORE, con il quale è la nuova riga ad essere scartata.

Per effettuare una REPLACE dovremo avere i permessi di INSERT e DELETE; le sintassi sono pressochè identiche a quelle della INSERT; vediamole:

REPLACE [LOW_PRIORITY | DELAYED]
[INTO] nome_tabella [(nome_colonna,...)]
VALUES ({espressione | DEFAULT},…),(…),…
oppure
REPLACE [LOW_PRIORITY | DELAYED]
[INTO] nome_tabella
SET nome_colonna={espressione | DEFAULT}, …
oppure
REPLACE [LOW_PRIORITY | DELAYED]
[INTO] nome_tabella [(nome_colonna,...)]
SELECT …

Un altro modo di inserire dati in una tabella è quello che ci consente di importare un file di testo: LOAD DATA INFILE. Vediamone la sintassi:

LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE ‘nome_file.txt’
[REPLACE | IGNORE]
INTO TABLE nome_tabella
[FIELDS
[TERMINATED BY 'stringa']
[[OPTIONALLY] ENCLOSED BY ‘char‘]
[ESCAPED BY 'char' ]
]
[LINES
[STARTING BY 'stringa']
[TERMINATED BY 'stringa']
]
[IGNORE numero LINES]
[(nome_colonna_o_variabile,...)]
[SET nome_colonna = espressione,...)]

Le opzioni LOW_PRIORITY e IGNORE funzionano come per una INSERT. L’opzione REPLACE permette all’istruzione di funzionare come una REPLACE.

L’opzione LOCAL specifica che il file da leggere si trova sulla macchina del client. Se non è presente, si assume che il file si trovi sulla macchina del server. In quest’ultimo caso è necessario il privilegio FILE per eseguire l’operazione.

Se si usa FIELDS è obbligatorio indicare almeno una delle opzioni che la compongono:

  • TERMINATED BY indica quale stringa separa i campi;
  • ENCLOSED BY indica i caratteri usati per racchiudere i valori;
  • ESCAPED BY specifica il carattere di escape usato per i caratteri speciali (cioè quelli utilizzati nelle altre opzioni di FIELDS e LINES)

LINES può indicare le opzioni per le righe: STARTING BY indica una stringa che sarà omessa in ogni riga (può anche non trovarsi all’inizio della riga, nel qual caso sarà omesso tutto ciò che si trova prima).

TERMINATED BY indica il carattere di fine riga. I default per FIELDS e LINES sono i seguenti:

FIELDS TERMINATED BY ‘\t’ ENCLOSED BY ” ESCAPED BY ‘\\’
LINES TERMINATED BY ‘\n’ STARTING BY ”

Quindi: campi suddivisi da tabulazioni e nessun carattere a racchiuderli; righe senza prefisso e che terminano con il carattere di newline; backslash come carattere di escape (per tabulazioni e newline).

IGNORE n LINES si usa per saltare le prime n righe del file di input (ad esempio perchè contengono intestazioni).

Può essere indicata una lista di nomi di colonna o variabili alle quali assegnare i valori letti dal file. Se questa lista non viene fornita, si presume che il file contenga in ogni riga un valore per ogni colonna della tabella; se si forniscono variabili, i valori non finiranno direttamente nella tabella, ma potranno essere utilizzati nella clausola SET per effettuare elaborazioni; con tale clausola è anche possibile assegnare valori ad altre colonne indipendentemente dai dati presenti nel file (ad esempio un timestamp).

Both comments and pings are currently closed.

Comments are closed.