Come spostare le colonne in una tabella MySQL?


207

Attualmente sto avendo la seguente tabella MySQL: Employees (empID, empName, department);

Voglio cambiare la tabella come segue: Employees (empID, department, empName);

Come si può fare usando le ALTERdichiarazioni?

Nota: voglio cambiare solo le posizioni delle colonne.


Posso chiedere perchè? L'ordine delle colonne è praticamente solo un problema estetico ...
ingannare

6
@deceze forse no - definisce l'ordine dei valori in SELECT *un'istruzione. (Concesso, se l'ordine dei valori è importante, si dovrebbe elencarli esplicitamente nell'affermazione, ma forse OP non ha il controllo totale qui.)
Ted Hopp

1
So che non influisce su nulla. La mia tabella originale ha molte colonne, quindi ho appena aggiunto 3 colonne che sono state aggiunte nell'ultima. Ma voglio loro di visualizzare in posizioni 3-4-5 per facilitare l'uso di SELECTdichiarazione
sumit

6
@iSumitG: nota anche che AFTER columnpuò essere usato anche con ALTER TABLE ADD column. (per la prossima volta aggiungi alcuni campi.)
ypercubeᵀᴹ

2
Se si carica un dump mysql, utilizza insert in valori. Quindi, ad esempio, se stai caricando i dati da prod in dev e le colonne sono fuori servizio, otterrai un errore. Ecco perché uno potrebbe voler fare questo.
Evviva Sto aiutando

Risposte:


345

Se empName è una colonna VARCHAR (50):

ALTER TABLE Employees MODIFY COLUMN empName VARCHAR(50) AFTER department;

MODIFICARE

Per i commenti, puoi anche fare questo:

ALTER TABLE Employees CHANGE COLUMN empName empName VARCHAR(50) AFTER department;

Si noti che la ripetizione di empNameè deliberata. Devi dire a MySQL che vuoi mantenere lo stesso nome di colonna.

Dovresti essere consapevole che entrambe le versioni della sintassi sono specifiche di MySQL. Non funzioneranno, ad esempio, in PostgreSQL o in molti altri DBMS.

Un'altra modifica: come sottolineato da @Luis Rossi in un commento, è necessario specificare completamente la definizione della colonna modificata appena prima del AFTERmodificatore. Gli esempi sopra hanno solo VARCHAR(50), ma se hai bisogno di altre caratteristiche (come NOT NULLo un valore predefinito) devi includere anche quelle. Consulta i documenti suALTER TABLE per maggiori informazioni.


6
Solo una nota: MODIFICA non è supportato fino alla versione 4.
Erre Efe

4
Devi ripetere il nome della colonna, poiché la sintassi presuppone che potresti voler modificare il nome della colonna. Ad esempio: ALTER TABLE Dipendenti CAMBIA COLONNA empName empName varchar (50) DOPO il dipartimento;
brianjcohen,

Tenere presente che l'ordine modificato non si rifletterà nei dump SQL del database.
skalee,

3
@SalehEnamShohag - Sì, secondo i documenti , la COLUMNparola chiave è facoltativa nelle ALTER TABLEistruzioni. Preferisco usarlo perché penso che renda la dichiarazione più leggibile.
Ted Hopp,

1
Funziona bene per me, nel mio caso avevo bisogno di definire la colonna NOT NULL DEFAULT 1, questo è fatto subito dopo il tipo di colonna nell'esempioVARCHAR(50)
Luiz Rossi

67

Cambia posizione colonna:

ALTER TABLE Employees 
   CHANGE empName empName VARCHAR(50) NOT NULL AFTER department;

Se è necessario spostarlo nella prima posizione, è necessario utilizzare il termine FIRST alla fine della query ALTER TABLE CHANGE [COLUMN]:

ALTER TABLE UserOrder 
   CHANGE order_id order_id INT(11) NOT NULL FIRST;

24
È stato molto utile menzionare come spostarlo in prima posizione
Tristian il

2
Qualche idea su come si comporterebbe su un grande tavolo? Sta solo cambiando alcuni metadati o deve riorganizzare i dati sul disco?
Kip

6
non importa, ho risposto alla mia domanda provandola su un tavolo che avevo con 3,9 milioni di righe, ci sono voluti circa 2 minuti. quindi sta decisamente facendo molto di più che scambiare alcuni metadati.
Kip

14

phpMyAdmin fornisce una GUI per questo all'interno della vista della struttura di una tabella. Selezionare per selezionare la colonna che si desidera spostare e fare clic sull'azione di modifica nella parte inferiore dell'elenco delle colonne. Puoi quindi modificare tutte le proprietà della colonna e troverai la funzione 'sposta colonna' all'estrema destra dello schermo.

Ovviamente, tutto questo sta solo costruendo le query nella risposta migliore perfettamente valida, ma i fan della GUI potrebbero apprezzare l'alternativa.

la mia versione di phpMyAdmin è la 4.1.7


1
La domanda si pone specificamente "Come si può fare usando le istruzioni ALTER". Non tutti quelli che eseguono MySQL usano phpMyAdmin.
Caleb,

3
Apprendo molto di ciò che faccio al giorno d'oggi da una riga di comando osservando l'output della query dagli strumenti della GUI come phpMyAdmin. Sono contento che questo post ottenga tutti i voti negativi di ppl su questa base: 1 persona lo vedrà, svolgerà il proprio lavoro in un ambiente in cui si sente a proprio agio, impara un po 'e va avanti.

per questa azione phpmyadmi non mostra il comando mentre esegue l'azione. Non trovato
Tebe

2
Wow, tanta rabbia per una soluzione alternativa che fa il trucco e complimenta le risposte che l'OP ha richiesto per un ALTER SQL.
Ewen,

1

Ho dovuto eseguirlo per una colonna introdotta nelle fasi successive di un prodotto, su oltre 10 tabelle. Quindi ho scritto questo veloce script disordinato per generare il comando alter per tutte le tabelle 'rilevanti'.

SET @NeighboringColumn = '<YOUR COLUMN SHOULD COME AFTER THIS COLUMN>';

SELECT CONCAT("ALTER TABLE `",t.TABLE_NAME,"` CHANGE COLUMN `",COLUMN_NAME,"` 
`",COLUMN_NAME,"` ", c.DATA_TYPE, CASE WHEN c.CHARACTER_MAXIMUM_LENGTH IS NOT 
NULL THEN CONCAT("(", c.CHARACTER_MAXIMUM_LENGTH, ")") ELSE "" END ,"  AFTER 
`",@NeighboringColumn,"`;")
FROM information_schema.COLUMNS c, information_schema.TABLES t
WHERE c.TABLE_SCHEMA = '<YOUR SCHEMA NAME>'
AND c.COLUMN_NAME = '<COLUMN TO MOVE>'
AND c.TABLE_SCHEMA = t.TABLE_SCHEMA
AND c.TABLE_NAME = t.TABLE_NAME
AND t.TABLE_TYPE = 'BASE TABLE'
AND @NeighboringColumn IN (SELECT COLUMN_NAME 
    FROM information_schema.COLUMNS c2 
    WHERE c2.TABLE_NAME = t.TABLE_NAME);
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.