REPLACE – Inserire e/o aggiornare dati nelle tabelle

REPLACE – Inserire e/o aggiornare dati nelle tabelle

Sinora abbiamo visto le 4 operazioni fondamentali che fanno parte del linguaggio SQL e che sono le istruzioni FONDAMENTALI del linguaggio SQL, facendo quindi un ripasso e lasciandoVi i link di quanto sino ad ora visto nei precedenti post:

  1. Inserimento dei dati
  2. Cancellazione dei dati
  3. Ricerche sui dati (e loro consultazione)
  4. Aggiornamento dei dati

Premesso che le operazioni sopra esposte debbano essere a buon titolo essere classificate come i tipici pilastri del linguaggio SQL e, di conseguenza devono essere studiate e conosciute; vorrei presentarne una che a mio avviso risulta particolarmente utile in quanto potrebbe semplificare notevolmente l'analisi e la logica in fase di sviluppo software per i programmi che si realizzano: l'istruzione che vedremo si chiama REPLACE INTO.


Questa istruzione, ci consente di poter operare come un'istruzione tipica di INSERT, con la quale, è possibile effettuare l'inserimento dati all'interno delle tabelle ma presenta un vantaggio aggiunto, nel caso in cui la chiave primaria che si deve inserire, sia già presente, allora, il REPLACE INTO effettua prima una cancellazione del record e poi un nuovo inserimento. Questo rende di fatto possibile un sorta di modifica o sostituzione dei dati eventualmente già  presenti in tabella.

Ovviamente, quanto sopra detto,  per i meno esperti potrebbe apparire quanto mai un'operazione di poco conto, ma per chi già  ha un minimo approccio al mondo dell'analisi ed al problem - solving, questa istruzione SQL consente in buona sostanza di risparmiarsi dei notevoli mal di testa ed al contempo di risparmiare tempo ed ulteriori istruzioni.
Come ?? In che modo??
Ebbene pensate ad esempio di dovervi servire delle istruzioni canoniche per la realizzazione di un programma che consenta di memorizzare in una tabella informazioni quali ad esempio la targa ed il numero di telefono del proprietario dell'automezzo.

Ebbene, avendo una tabella fatta nel seguente modo:

CREATE TABLE `automezzi` ( Costruzione della tabella automezzi
`targa` varchar(10) NOT NULL, Campo targa è un testo non nullo
`tel` varchar(50) NOT NULL Campo tel è un numero telefonico
PRIMARY KEY (`targa`) definizione della chiave primaria
); - fine -

CREATE TABLE `automezzi` (
`targa` varchar(10) NOT NULL,
`tel` varchar(50) NOT NULL,
PRIMARY KEY  (`targa`)
);

Si dovrebbe realizzare un programma che sia in grado eseguire i seguenti passi procedurali:

  1. Cercare un numero di targa, verificandone così l'esistenza;
  2. Se il numero di targa è già  presente cancelli l'occorenza del record così trovato; se il record non è stato trovato vado avanti al punto successivo
  3. Inserisco i dati nuovi ed aggiornati.

"Traducendo" i passi sopra esposti in SQL avremmo qualcosa del tipo:

  1. SELECT COUNT(*) FROM automezzi WHERE targa='MiaTarga' => Cerco l'esistenza della targa da trattare;
  2. DELETE FROM automezzi WHERE targa='targa_automezzo' => Se al punto 1 ottengo un numero diverso da zero allora cancello il record eseguendo questa istruzione altrimenti la ignoro e proseguo al punto successivo;
  3. INSERT INTO automezzi (targa,tel) VALUES('MiaTarga', '111 222 333') => Effettuo l'inserimento dei dati;

Come si può facilmente vedere le istruzioni qui sopra consentono di effettuare quanto richiesto, anche se, di fatto, nel caso di esistenza del dato, si poteva anche provvedere ad un aggiornamento degli stessi risparmiandoci così, un passo procedurale, a tutto beneficio delle eventuali performance.

Qual'ora invece si prediliga un sistema che a scapito delle performance semplifichi notevolmente la logica di gestione, si può adottare la clausola REPLACE INTO nel seguente modo:
REPLACE INTO automezzi (targa, tel) VALUES ('MiaTarga','333 222 111');

Riporto qui di seguito la sintassi ufficiale:
Name: 'REPLACE INTO'
Description:
Syntax:
REPLACE [LOW_PRIORITY | DELAYED]
[INTO] tbl_name [(col_name,...)]
{VALUES | VALUE} ({expr | DEFAULT},...),(...),...

Or:

REPLACE [LOW_PRIORITY | DELAYED]
[INTO] tbl_name
SET col_name={expr | DEFAULT}, ...

Or:

REPLACE [LOW_PRIORITY | DELAYED]
[INTO] tbl_name [(col_name,...)]
SELECT ...

REPLACE works exactly like INSERT, except that if an old row in the
table has the same value as a new row for a PRIMARY KEY or a UNIQUE
index, the old row is deleted before the new row is inserted. See [HELP
INSERT].

REPLACE is a MySQL extension to the SQL standard. It either inserts, or
deletes and inserts. For another MySQL extension to standard SQL ---
that either inserts or updates --- see

http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html.

Note that unless the table has a PRIMARY KEY or UNIQUE index, using a
REPLACE statement makes no sense. It becomes equivalent to INSERT,
because there is no index to be used to determine whether a new row
duplicates another.

Values for all columns are taken from the values specified in the
REPLACE statement. Any missing columns are set to their default values,
just as happens for INSERT. You cannot refer to values from the current
row and use them in the new row. If you use an assignment such as SET
col_name = col_name + 1, the reference to the column name on the right
hand side is treated as DEFAULT(col_name), so the assignment is
equivalent to SET col_name = DEFAULT(col_name) + 1.

To use REPLACE, you must have both the INSERT and DELETE privileges for
the table.

URL: http://dev.mysql.com/doc/refman/5.0/en/replace.html

 

PICCOLA NOTA IMPORTANTE:

Tale istruzione è un'estensione di MySQL al linguaggio ANSI SQL standard, di conseguenza questa istruzione, seppur utile, è deprecata/sconsigliata in ogni altro contesto che non sia quello di MySQL avente versione 5.0 poichè essa non è aderente allo standard.
Ovviamente prima che tu lettore possa sollevare

Pubblicato in Documentazione Tecnica, MySQL e taggato , .