Mysql
 sql >> Database >  >> RDS >> Mysql

Come prevenire il commit implicito di MySQL

Un altro approccio hacky che ho appena provato con successo è ottenere il DDL create table tramite il comando specifico di mysql

SHOW CREATE TABLE `tableName`

Quindi crea un po' di regexp magic e crea una nuova query DDL che creerà una tabella temporanea basata sulla tabella originale, con tutte le modifiche alla tabella alter incorporate nella tabella di creazione.

Nel mio progetto basato su PHP, ho fatto quanto segue per aggiungere un indice univoco a una tabella temporanea. Ha funzionato e non si è verificato più alcun commit implicito nel mezzo della transazione.

$createDDL = ... get from SHOW CREATE TABLE `tableName`
$nr = 0;
$createDDL = preg_replace("/CREATE TABLE `$tableName` \(/", "CREATE TEMPORARY TABLE `$tmpName` (\nUNIQUE `ukey-1` ($uniqCols),", $createDDL, -1, $nr);
if (!$nr)
  throw new Exception("CREATE TABLE replacement error. No reps made.");
mysqli_query($con, $createDDL);

MODIFICA A proposito, ecco alcune segnalazioni di bug (funzionalità) (da molti anni). Nella prima puoi vedere una risposta (risalente al 2006) che afferma:poiché questo comportamento è lo stesso di oracle db, questo è quello coerente...

Forse dovrebbe essere avviata una richiesta di funzionalità "campagna di spam" per far rivivere questa richiesta di funzionalità!