Wie verschiebe ich Spalten in einer MySQL-Tabelle?

207

Derzeit habe ich die folgende MySQL-Tabelle: Employees (empID, empName, department);

Ich möchte die Tabelle wie folgt ändern: Employees (empID, department, empName);

Wie kann dies mit ALTERAnweisungen geschehen ?

Hinweis: Ich möchte nur die Spaltenpositionen ändern.

sumit
quelle
Darf ich fragen warum? Die Spaltenreihenfolge ist so ziemlich nur ein ästhetisches Problem ...
täuschen
6
@deceze vielleicht nicht - es definiert die Reihenfolge der Werte in einer SELECT *Anweisung. (Zugegeben, wenn die Reihenfolge der Werte wichtig ist, sollte man sie explizit in der Anweisung auflisten, aber vielleicht hat OP hier keine vollständige Kontrolle.)
Ted Hopp
1
Ich weiß, dass es nichts beeinflusst. Meine ursprüngliche Tabelle enthält viele Spalten, daher habe ich gerade 3 Spalten hinzugefügt, die in der letzten hinzugefügt wurden. Aber ich möchte, dass sie an den Positionen 3-4-5 angezeigt werden, um die Verwendung der SELECTAnweisung zu
vereinfachen
6
@iSumitG: Beachten Sie auch, dass das AFTER columnauch mit verwendet werden kann ALTER TABLE ADD column. (Für das nächste Mal fügen Sie einige Felder hinzu.)
ypercubeᵀᴹ
2
Beim Laden eines MySQL-Dumps wird das Einfügen in Werte verwendet. Wenn Sie beispielsweise Daten von prod in dev laden und die Spalten nicht in Ordnung sind, wird eine Fehlermeldung angezeigt. Deshalb möchte man das vielleicht tun.
Hurra, ich helfe

Antworten:

344

Wenn empName eine VARCHAR (50) -Spalte ist:

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

BEARBEITEN

Gemäß den Kommentaren können Sie dies auch tun:

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

Beachten Sie, dass die Wiederholung empNameabsichtlich ist. Sie müssen MySQL mitteilen, dass Sie denselben Spaltennamen beibehalten möchten.

Sie sollten sich bewusst sein, dass beide Syntaxversionen spezifisch für MySQL sind. Sie funktionieren beispielsweise in PostgreSQL oder vielen anderen DBMS nicht.

Eine weitere Änderung: Wie von @Luis Rossi in einem Kommentar hervorgehoben, müssen Sie die geänderte Spaltendefinition unmittelbar vor dem AFTERModifikator vollständig angeben . Die obigen Beispiele haben nur VARCHAR(50), aber wenn Sie andere Merkmale (wie NOT NULLoder einen Standardwert) benötigen, müssen Sie diese ebenfalls einschließen. Konsultieren Sie die Dokumentation aufALTER TABLE für weitere Informationen.

Ted Hopp
quelle
6
Nur ein Hinweis: MODIFY wird erst in Version 4 unterstützt.
Erre Efe
4
Sie müssen den Spaltennamen wiederholen, da die Syntax davon ausgeht, dass Sie den Spaltennamen ändern möchten. Beispiel: ALTER TABLE Mitarbeiter CHANGE COLUMN empName empName varchar (50) NACH der Abteilung;
Brianjcohen
Beachten Sie, dass die geänderte Reihenfolge nicht in Datenbank-SQL-Dumps berücksichtigt wird.
Skalee
3
@SalehEnamShohag - Ja, laut den Dokumenten ist das COLUMNSchlüsselwort in ALTER TABLEAnweisungen optional . Ich bevorzuge es, weil ich denke, dass es die Aussage lesbarer macht.
Ted Hopp
1
Funktioniert gut für mich, in meinem Fall musste ich definieren, dass die Spalte war NOT NULL DEFAULT 1, dies geschieht direkt nach dem Spaltentyp im BeispielVARCHAR(50)
Luiz Rossi
67

Spaltenposition ändern:

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

Wenn Sie es an die erste Position verschieben müssen, müssen Sie am Ende der Abfrage ALTER TABLE CHANGE [COLUMN] den Begriff FIRST verwenden:

ALTER TABLE UserOrder 
   CHANGE order_id order_id INT(11) NOT NULL FIRST;
Igor Kostin
quelle
24
Es war sehr nützlich zu
erwähnen,
2
Irgendeine Idee, wie dies auf einem großen Tisch funktionieren würde? Ändert es nur einige Metadaten oder muss es tatsächlich Daten auf der Festplatte neu organisieren?
Kip
6
egal, beantwortete meine eigene Frage, indem ich sie an einem Tisch mit 3,9 Millionen Zeilen ausprobierte. Es dauerte ungefähr 2 Minuten. Es geht also definitiv um mehr als nur um das Austauschen einiger Metadaten.
Kip
14

phpMyAdmin bietet hierfür eine GUI in der Strukturansicht einer Tabelle. Aktivieren Sie diese Option, um die Spalte auszuwählen, die Sie verschieben möchten, und klicken Sie auf die Änderungsaktion am Ende der Spaltenliste. Sie können dann alle Spalteneigenschaften ändern und finden die Funktion "Spalte verschieben" ganz rechts auf dem Bildschirm.

Natürlich baut dies alles nur die Fragen in der perfekten Top-Antwort auf, aber GUI-Fans werden die Alternative vielleicht zu schätzen wissen.

meine phpMyAdmin version ist 4.1.7


quelle
1
In der Frage wird speziell gefragt, wie dies mit ALTER-Anweisungen erfolgen kann. Nicht jeder, der MySQL ausführt, verwendet phpMyAdmin.
Caleb
3
Ich lerne viel von dem, was ich heutzutage an einer Befehlszeile mache, indem ich die Abfrageausgabe von GUI-Tools wie phpMyAdmin beobachte. Ich freue mich, dass dieser Beitrag so viele Abstimmungen erhält, wie es die Leute auf dieser Grundlage für richtig halten: 1 Person wird dies sehen, ihre Arbeit in einer Umgebung erledigen, in der sie sich wohl fühlen, ein wenig lernen und weitermachen.
Für diese Aktion zeigt phpmyadmi nicht den Befehl an, der die Aktion ausführt. Nicht gefunden
Tebe
2
Wow, so viel Ärger über eine alternative Lösung, die den Trick macht und die Antworten ergänzt, die das OP für eine ALTER SQL angefordert hat.
Ewen
1

Ich musste dies für eine Spalte ausführen, die in den späteren Phasen eines Produkts auf mehr als 10 Tabellen eingeführt wurde. Also schrieb ich dieses schnelle, unordentliche Skript, um den Befehl alter für alle 'relevanten' Tabellen zu generieren.

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);
uchamp
quelle