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

ALTER TABLE senza bloccare il tavolo?

L'unica altra opzione è eseguire manualmente ciò che fanno comunque molti sistemi RDBMS...
- Crea una nuova tabella

È quindi possibile copiare il contenuto della vecchia tabella su un blocco alla volta. Pur essendo sempre prudente di qualsiasi INSERT/UPDATE/DELETE sulla tabella di origine. (Potrebbe essere gestito da un trigger. Anche se questo causerebbe un rallentamento, non è un blocco...)

Una volta terminato, cambia il nome della tabella di origine, quindi cambia il nome della nuova tabella. Preferibilmente in una transazione.

Una volta terminato, ricompilare tutte le stored procedure, ecc. che utilizzano quella tabella. È probabile che i piani di esecuzione non saranno più validi.

MODIFICA:

Sono stati fatti alcuni commenti sul fatto che questa limitazione sia un po' scarsa. Quindi ho pensato di dargli una nuova prospettiva per mostrare perché è così com'è...

  • Aggiungere un nuovo campo è come cambiare un campo su ogni riga.
  • I blocchi dei campi sarebbero molto più difficili dei blocchi delle righe, per non parlare dei blocchi delle tabelle.

  • Stai effettivamente cambiando la struttura fisica del disco, ogni record si sposta.
  • Questo è davvero come un AGGIORNAMENTO sull'intero tavolo, ma con un impatto maggiore...