Come Clonare Record in MySQL

Capita spesso di dover duplicare dei record di una tabella oppure di creare nuovi record modificando qualche campo di record esistenti.
Farlo con due righe di codice non rappresenta un grosso problema: si crea il record nuovo, si recuperano i valori dei campi da usare e si aggiorna il record appena creato.
Facile ma non elegante e probabilmente neanche ottimizzato e veloce.

Si può fare con una query?
Certamente

INSERT INTO tabella SELECT * FROM tabella WHERE id=1

Con questa query otterremo una copia esatta del record con ID = 1. Noi però vogliamo una copia modificata di quel record.

Possiamo allora specificare i valori diversi che intendiamo usare

INSERT INTO tabella (id, campo_1, campo_2, campo_3, campo_4)
SELECT (id, ‘valore nuovo’, campo_2, campo_3, campo_4) FROM tabella WHERE id=1

Avremo così un record gemello a quello di partenza tranne per il valore di campo_1.

Ma se id fosse una chiave univoca? be’ ovviamente la query fallirebbe non potendo creare un duplicato di id = 1.
Allora copiamo tutto il record tranne id

INSERT INTO tabella (campo_1, campo_2, campo_3, campo_4)
SELECT (‘valore nuovo’, campo_2, campo_3, campo_4) FROM tabella WHERE id=1
così però, se id non è auto_increment, avremo id=0.
Meglio allora specificare una nuova chiave:
INSERT INTO tabella (id, campo_1, campo_2, campo_3, campo_4)
SELECT (select MAX(id) FROM tabella)+1,’valore nuovo’, campo_2, campo_3, campo_4 FROM tabella WHERE id=1

Io però ho avuto un altro problema. Le tabelle che stavo usando subivano frequenti modifiche alla struttura e ad ogni modifica dovevo aggirarmi per diversi file del codice per andare ad allineare la lista dei campi.
Come ne sono uscito?

Le tabelle di tipo temporaneo sono tabelle che esistono nel nostro database solo fino al termine della sessione di lavoro e sono molto utili quando si ha bisogno di appoggiare un set di dati su cui lavorare da qualche parte (risultato di altre query, per esempio una cascata di JOIN). Se state usando uno script spariranno al termine dell’esecuzione dello stesso, se vi state connettendo al db con un client verranno eliminate quando vi sconnetterete, oppure, potete cancellarle manualmente come tutte le tabelle con un DROP.

Nel mio caso ho sfruttato una TEMPORARY TABLE per appoggiarci il record che volevo clonare, ho eseguito le modifiche che mi servivano, ho inserito la nuova riga nella tabella di partenza ed infine ho cancellato tabella temporanea.
CREATE TEMPORARY TABLE tabella_2 SELECT * FROM tabella WHERE id=1;
UPDATE tabella_2 SET id=2, campo_1=’valore nuovo’;
INSERT INTO tabella SELECT * FROM tabella_2;
DROP TABLE tabella_2;

In questo modo ho aggirato il problema delle chiavi e ora la tabella potrebbe anche diventare di mille campi e io non dovrei modificare una virgola.