如何在MySQL表中移动列?

Sum*_*pta 186 mysql sql alter

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

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

如何使用ALTER语句完成此操作?

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

Ted*_*opp 315

如果empName是VARCHAR(50)列:

ALTER TABLE Employees MODIFY COLUMN empName VARCHAR(50) AFTER department;
Run Code Online (Sandbox Code Playgroud)

编辑

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

ALTER TABLE Employees CHANGE COLUMN empName empName VARCHAR(50) AFTER department;
Run Code Online (Sandbox Code Playgroud)

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

您应该知道两种语法版本都特定于MySQL.例如,它们不适用于PostgreSQL或许多其他DBMS.

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

  • 好吧,`CHANGE COLUMN`也适用于此. (6认同)
  • 请注意:版本4之前不支持MODIFY. (5认同)
  • 您需要重复列名称,因为语法假定您可能要更改列名称.例如:ALTER TABLE Employees CHANGE COLUMN empName empName varchar(50)AFTER部门; (3认同)
  • @SalehEnamShohag - 是的,根据[文档](http://dev.mysql.com/doc/refman/5.7/en/alter-table.html),`COLUMN`关键字在`ALTER TABLE`语句中是可选的.我更喜欢使用它,因为我认为它使语句更具可读性. (3认同)

小智 63

更改列位置:

ALTER TABLE Employees 
   CHANGE empName empName VARCHAR(50) NOT NULL AFTER department;
Run Code Online (Sandbox Code Playgroud)

如果需要将其移动到第一个位置,则必须在ALTER TABLE CHANGE [COLUMN]查询结束时使用术语FIRST:

ALTER TABLE UserOrder 
   CHANGE order_id order_id INT(11) NOT NULL FIRST;
Run Code Online (Sandbox Code Playgroud)

  • 提及如何将其移至第一位置非常有用 (22认同)
  • 没关系,回答我自己的问题,尝试在我有3.9M行的桌子上,花了大约2分钟.所以它绝对不仅仅是交换一些元数据. (6认同)
  • 任何想法这将如何在大桌子上执行?它只是更改某些元数据,还是实际上必须重新组织磁盘上的数据? (2认同)

小智 11

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

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

我的phpMyAdmin版本是4.1.7

  • 通过观察GUI工具(如phpMyAdmin)的查询输出,我从命令行学到了很多东西.我很高兴能够在这个基础上获得尽可能多的赞成票:1个人会看到这一点,在他们感到舒适的环境中完成他们的工作,学习一点并继续前进. (3认同)
  • 该问题特别询问“如何使用 ALTER 语句完成此操作”。不是每个运行 MySQL 的人都使用 phpMyAdmin。 (2认同)