Come posso scambiare le tabelle in MySQL?


51

Supponiamo, ho una tabella foo, che contiene alcune statistiche che vengono calcolate ogni tanto. È ampiamente utilizzato da altre query.

Ecco perché voglio calcolare le statistiche più recenti foo_newe scambiarle quando il calcolo è pronto.

Potrei fare

ALTER TABLE foo RENAME foo_tmp;
ALTER TABLE foo_new RENAME foo;

ma cosa succede se una query ha bisogno di una tabella footra quelle due righe quando non c'è una tabella foo? Immagino di doverlo bloccare in qualche modo ... o c'è un altro modo per farlo?

Risposte:


79

Usa questo comando:

RENAME TABLE foo TO foo_old, foo_new To foo;

È un'operazione atomica: entrambe le tabelle sono bloccate insieme (e per un tempo molto breve), quindi qualsiasi accesso avviene prima o dopo il RENAME.



2
Un problema con questo è che, se ho, tableXha riferimenti ai vincoli dei genitori foo. Dopo questo RENAME ora farà riferimento foo_oldma se non ci sono vincoli di riferimento, fooallora dovresti essere OK ...
Marcin Wasiluk,

@MarcinWasiluk - ancora un altro svantaggio di FOREIGN KEYs.
Rick James,

2
Vale anche la pena sapere che RENAME TABLE deve attendere il completamento delle query esistenti sulla tabella fino a quando non può essere eseguito. Andrebbe bene, ma blocca anche altre query in attesa che RENAME accada! Ciò può causare un serio blocco delle tabelle del database (è per noi). Questo vale per innodb!
John Hunt,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.