如何在MySQL表中移动列?


207

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

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

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

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


请问为什么?列顺序几乎只是一个美学问题...
deceze

6
@deceze可能不是-它定义了SELECT *语句中值的顺序。(当然,如果值的顺序很重要,则应在语句中明确列出它们,但OP此处可能没有完全控制权。)
Ted Hopp

1
我知道它不会影响任何事情。我的原始表有很多列,所以我只添加了3列,最后添加了三列。但我希望他们在位置3-4-5显示,以缓解使用的SELECT语句
SUMIT

6
@iSumitG:还请注意,AFTER column可以与一起使用ALTER TABLE ADD column。(下一次您添加一些字段。)
ypercubeᵀᴹ2011年

2
如果加载mysql转储,它将使用插入值。因此,例如,如果您要将数据从prod加载到dev中,并且列不整齐,则会出现错误。这就是为什么可能要这样做的原因。
Hooray Im帮助

Answers:


344

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


6
只是注意:不支持MODIFY直到第4版
ERRE埃菲社

4
您需要重复列名,因为语法假定您可能要更改列名。例如:ALTER TABLE雇员CHANGE COLUMN empName empName varName(50)之后的部门;
brianjcohen 2012年

请记住,更改的顺序将不会反映在数据库SQL转储中。
skalee 2015年

3
@SalehEnamShohag-是的,根据docsCOLUMN关键字在ALTER TABLE语句中是可选的。我更喜欢使用它,因为我认为它使语句更具可读性。
泰德·霍普

1
对我来说工作正常,在我的情况下,我需要定义列为NOT NULL DEFAULT 1,这是在示例中的列类型之后完成的VARCHAR(50)
Luiz Rossi

67

更改列位置:

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;

24
提到如何将其移至第一位置非常有用
Tristian

2
任何想法这将如何在大桌子上执行?它只是更改某些元数据,还是实际上必须重新组织磁盘上的数据?
Kip

6
没关系,通过在我有390万行的表上进行尝试来回答我自己的问题,大约花了2分钟。因此,它肯定要做的不仅仅是交换一些元数据。
基普2015年

14

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

当然,所有这些都只是在完美的最佳答案中构建查询,但是GUI爱好者可能会喜欢这种选择。

我的phpMyAdmin版本是4.1.7


1
该问题专门询问“如何使用ALTER语句完成此工作”。并非每个运行MySQL的人都使用phpMyAdmin。
Caleb 2015年

3
通过观察诸如phpMyAdmin之类的GUI工具的查询输出,我现在可以在命令行中学到很多东西。我很高兴在这个基础上让这篇帖子得到ppl认为合适的众多赞成票:1个人会看到这一点,在一个感到舒适的环境中完成工作,学习一些并继续前进。

对于此操作,phpmyadmi不显示执行该操作的命令。找不到
Tebe

2
哇,人们对替代解决方案充满了愤怒,该解决方案可以解决问题,并补充OP为ALTER SQL请求的答案。
Ewen

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);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.