目前我有以下MySQL表:Employees (empID, empName, department);
我想将表格更改为以下内容:Employees (empID, department, empName);
如何使用ALTER
语句完成此操作?
注意:我只想更改列位置。
答案 0 :(得分:298)
如果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
或默认值),则还需要包含这些特征。有关详细信息,请参阅the docs on ALTER TABLE
。
答案 1 :(得分:60)
更改列位置:
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;
答案 2 :(得分:11)
phpMyAdmin在表的结构视图中为此提供GUI。 选中以选择要移动的列,然后单击列列表底部的更改操作。 然后,您可以更改所有列属性,然后您将找到“移动列”列表'功能位于屏幕的最右侧。
当然,这只是在完美的顶级答案中构建查询,但GUI粉丝可能会欣赏其他选择。
我的phpMyAdmin版本是4.1.7
答案 3 :(得分: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);