236

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

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

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

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

4

4 回答 4

390

如果 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

于 2011-07-24T07:08:33.347 回答
78

更改列位置:

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;
于 2013-07-09T00:28:39.983 回答
19

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

当然,这只是在完美的最佳答案中构建查询,但 GUI 粉丝可能会喜欢这种替代方法。

我的 phpMyAdmin 版本是 4.1.7

于 2014-05-19T20:22:01.573 回答
1

我必须在 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);
于 2017-06-20T06:42:56.863 回答