如何移动MySQL表中的列?

目前我有以下的MySQL表: Employees (empID, empName, department);

我想要将表更改为以下内容: Employees (empID, department, empName);

这怎么能用ALTER语句来完成呢?

注意:我只想更改列位置。

如果empName是VARCHAR(50)列:

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

编辑

根据评论,你也可以这样做:

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

请注意,重复的empName是故意的。 你必须告诉MySQL你想保持相同的列名。

你应该知道这两个语法版本都是针对MySQL的。 例如,在PostgreSQL或许多其他DBMS中,它们将不起作用。

另一个编辑:正如@Luis Rossi在评论中指出的那样,您需要在AFTER修饰符之前完全指定已更改的列定义。 上面的例子只有VARCHAR(50) ,但是如果你需要其他的特性(比如NOT NULL或默认值),你也需要包含这些特性。 有关更多信息,请参阅ALTER TABLE上的文档 。

更改列位置:

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

如果您需要将其移动到第一个位置,则必须在ALTER TABLE CHANGE [COLUMN]查询的末尾使用FIRST一词:

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

phpMyAdmin在表格的结构视图中为此提供了一个GUI。 选中要select要移动的列,然后单击列列表底部的更改操作。 然后,您可以更改所有列属性,并在屏幕最右侧find“移动列”function。

当然,这只是build立在非常好的最佳答案的查询,但GUI粉丝可能会喜欢的替代scheme。

我的phpMyAdmin版本是4.1.7

我必须运行这个在一个产品的晚期阶段介绍的列,在10 +表。 所以写了这个快速凌乱的脚本来生成所有“相关”表的alter命令。

 SELECT CONCAT("ALTER TABLE `",TABLE_NAME,"` CHANGE COLUMN `",COLUMN_NAME,"` `",COLUMN_NAME,"` BIGINT AFTER `id`;") FROM information_schema.COLUMNS c WHERE TABLE_SCHEMA = '<YOUR SCHEMA NAME>' AND COLUMN_NAME = '<COLUMN TO MOVE>' AND TABLE_TYPE = 'BASE TABLE' AND '<COLUMN TO MOVE AFTER>' IN (SELECT COLUMN_NAME FROM information_schema.COLUMNS c2 WHERE c.TABLE_NAME = c2.TABLE_NAME);