目前我有以下MySQL表:员工(empID, empName,部门);

我想更改表如下:员工(empID,部门,empName);

如何使用ALTER语句来做到这一点?

注意:我只想改变列的位置。


当前回答

我必须在一个产品后期阶段的专栏中运行这个程序,在10多个表上。因此,编写了这个快速的不整洁脚本,为所有“相关”表生成alter命令。

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

其他回答

如果empName是VARCHAR(50)列:

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

EDIT

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

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文档。

phpMyAdmin在表的结构视图中为此提供了一个GUI。 选中以选择要移动的列,然后单击列列表底部的更改操作。 然后你可以改变所有的列属性,你会发现“移动列”函数在屏幕的最右边。

当然,这只是在完美的顶部回答中构建查询,但GUI粉丝可能会欣赏替代方案。

我的phpMyAdmin版本是4.1.7

更改列位置:

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

如果你需要把它移动到第一个位置,你必须在ALTER TABLE CHANGE [COLUMN]查询的末尾使用term first:

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

对于那些使用TablePlus的人,你可以只标记所有的表,右键单击->复制,在新表->粘贴。

我必须在一个产品后期阶段的专栏中运行这个程序,在10多个表上。因此,编写了这个快速的不整洁脚本,为所有“相关”表生成alter命令。

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