2011-11-17 26 views

risposta

6

Rinominare una colonna (con ALTER TABLE ... CHANGE COLUMN) richiede purtroppo a MySQL di eseguire una copia completa della tabella.

Check out pt-online-schema-change. Questo ti aiuta a fare molti tipi di modifiche ALTER in una tabella senza bloccare l'intera tabella per la durata di ALTER. Puoi continuare a leggere e scrivere la tabella originale mentre copia i dati nella nuova tabella. Le modifiche vengono acquisite e applicate alla nuova tabella tramite i trigger.

Esempio:

pt-online-schema-change h=localhost,D=databasename,t=tablename \ 
    --alter 'CHANGE COLUMN oldname newname NUMERIC(9,2) NOT NULL' 

Aggiornamento: MySQL 5.6 può fare alcuni tipi di operazioni ALTER senza ricostruire la tavola, e cambiando il nome di una colonna è uno di quelli supportati da una modifica in linea . Vedere http://dev.mysql.com/doc/refman/5.6/en/innodb-create-index-overview.html per una panoramica di quali tipi di alterazioni lo supportano o no.

0

Se non ci sono vincoli su di esso, è possibile modificarlo senza problemi, per quanto ne so. Se è necessario rimuovere prima i vincoli, modificare e aggiungere nuovamente i vincoli.

0

Alterare una tabella con più righe può richiedere molto tempo (anche se le colonne coinvolte non sono indicizzate, potrebbe essere banale).

Se specificamente vuole evitare di utilizzare la ALTER TABLE sintassi creata appositamente per questo scopo, si può sempre creare una tabella con quasi la stessa struttura (ma nome diverso) e copiare tutti i dati in esso, in questo modo:

CREATE TABLE `your_table2` ...; 
    -- (using the query from SHOW CREATE TABLE `your_table`, 
    -- but modified with your new column changes) 

LOCK TABLES `your_table` WRITE; 
INSERT INTO `your_table2` SELECT * FROM `your_table`; 
RENAME TABLE `your_table` TO `your_table_old`, `your_table2` TO `your_table`; 

Per alcune query di ALTER TABLE, quanto sopra può essere un po 'più veloce. Tuttavia, per una semplice modifica del nome della colonna, potrebbe essere banale. Potrei provare a creare una tabella identica e ad eseguire la modifica su di essa per vedere quanto tempo stai effettivamente guardando.

Problemi correlati