Как переместить столбцы в таблице MySQL?


207

В настоящее время у меня есть следующая таблица MySQL: Employees (empID, empName, department);

Я хочу изменить таблицу на следующее: Employees (empID, department, empName);

Как это можно сделать с помощью ALTERутверждений?

Примечание: я хочу изменить только позиции столбцов.


Могу я спросить, почему? Порядок столбцов в значительной степени просто эстетическая проблема ...
deceze

6
@deceze, возможно, нет - он определяет порядок значений в SELECT *выражении. (Конечно, если важен порядок значений, следует явно перечислить их в операторе, но, возможно, OP здесь не имеет полного контроля.)
Тед Хопп,

1
Я знаю, это ни на что не влияет. В моей исходной таблице много столбцов, поэтому я только добавил 3 столбца, которые добавляются в последний. Но я хочу, чтобы они отображались в позициях 3-4-5, чтобы облегчить использование SELECTвысказываний
sumit

6
@iSumitG: Также обратите внимание, что AFTER columnможно использовать и с ALTER TABLE ADD column. (в следующий раз вы добавите несколько полей.)
ypercubeᵀᴹ

2
При загрузке дампа mysql используется вставка в значения. Так что если вы, например, загружаете данные из prod в dev, а столбцы не в порядке, вы получите ошибку. Вот почему кто-то может захотеть сделать это.
Ура, я помогаю

Ответы:


345

Если 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 или многих других СУБД.

Другое редактирование: Как отметил @Luis Rossi в комментарии, вам нужно полностью указать определение измененного столбца непосредственно перед AFTERмодификатором. Приведенные выше примеры просто есть VARCHAR(50), но если вам нужны другие характеристики (например, NOT NULLили значение по умолчанию), вы должны включить их. Обратитесь к документацииALTER TABLE для получения дополнительной информации.


6
Только примечание: MODIFY не поддерживается до версии 4.
Erre Efe

4
Вам нужно повторить имя столбца, потому что синтаксис предполагает, что вы можете изменить имя столбца. Например: ALTER TABLE Сотрудники ИЗМЕНИТЬ КОЛОННУ empName empName varchar (50) ПОСЛЕ отдела;
brianjcohen

Имейте в виду, что измененный порядок не будет отражен в дампах базы данных SQL.
Скали

3
@SalehEnamShohag - Да, согласно документам , COLUMNключевое слово является необязательным в ALTER TABLEутверждениях. Я предпочитаю использовать это, потому что я думаю, что это делает заявление более читабельным.
Тед Хопп

1
У меня работает нормально, в моем случае мне нужно было определить, что столбец был NOT NULL DEFAULT 1, это делается сразу после типа столбца в примереVARCHAR(50)
Luiz Rossi

67

Изменить положение столбца:

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

Если вам нужно переместить его на первую позицию, вы должны использовать термин FIRST в конце запроса ALTER TABLE CHANGE [COLUMN]:

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

24
Упоминание о том, как переместить его на первую позицию, было весьма полезным
Тристиан

2
Любая идея, как это будет работать на большом столе? Это просто изменение некоторых метаданных, или на самом деле нужно реорганизовать данные на диске?
Кип

6
не обращая внимания, я ответил на свой вопрос, попробовав его на столе с 3,9 млн строк, это заняло около 2 минут. так что это определенно делает больше, чем просто обмен метаданными.
Кип

14

phpMyAdmin предоставляет графический интерфейс для этого в представлении структуры таблицы. Установите флажок, чтобы выбрать столбец, который вы хотите переместить, и щелкните действие изменения в нижней части списка столбцов. Затем вы можете изменить все свойства столбца, и вы найдете функцию «Переместить столбец» в правой части экрана.

Конечно, это всего лишь построение запросов с очень хорошим верхним ответом, но поклонники графического интерфейса могут оценить альтернативу.

моя версия phpMyAdmin 4.1.7


1
Вопрос задается конкретно: «Как это можно сделать с помощью операторов ALTER». Не каждый, кто работает с MySQL, использует phpMyAdmin.
Калеб

3
Я узнал многое из того, что я делаю в настоящее время в командной строке, наблюдая за выводом запросов из инструментов GUI, таких как phpMyAdmin. Я рад за этот пост, чтобы получить столько отрицательных голосов, сколько чел считает нужным на этом основании: 1 человек увидит это, выполнит свою работу в обстановке, в которой он чувствует себя комфортно, выучит немного и будет двигаться дальше.

для этого действия phpmyadmi не показывает команду, выполняющую действие. Не нашел его
Tebe

2
Ого, так много гнева за альтернативное решение, которое делает свое дело и дополняет ответы, которые ОП запросил для ALTER SQL.
Эвен

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);
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.