Як переміщувати стовпці в таблиці MySQL?


207

На даний момент у мене є така таблиця MySQL: Employees (empID, empName, department);

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

Як це можна зробити за допомогою ALTERоператорів?

Примітка. Я хочу змінити лише положення стовпців.


Чи можу я запитати, чому? Порядок стовпців - це лише проблема естетичної проблеми ...
дезте

6
@deceze, можливо, ні - він визначає порядок значень у SELECT *виписці. (Зрозуміло, якщо порядок значень важливий, слід чітко перелічити їх у виписці, але, можливо, ОП тут не має тотального контролю.)
Тед Хопп,

1
Я знаю, що це нічого не впливає. У моїй оригінальній таблиці є багато стовпців, тому я щойно додав 3 стовпчики, які додані в останніх. Але я хочу, щоб вони відображалися в позиціях 3-4-5, щоб полегшити використання SELECTоператора
відправте

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

2
Якщо ви завантажуєте дамп mysql, він використовує вставку у значення. Отже, якщо ви, наприклад, завантажуєте дані з prod у розробник, а стовпці вийшли з ладу, ви отримаєте помилку. Ось чому, можливо, хочеться це зробити.
Hooray Im Helping

Відповіді:


345

Якщо empName - це стовпець VARCHAR (50):

ALTER TABLE Employees MODIFY COLUMN empName VARCHAR(50) AFTER department;

EDIT

Відповідно до коментарів, ви також можете це зробити:

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
Вам потрібно повторити ім'я стовпця, оскільки синтаксис передбачає, що ви можете змінити ім'я стовпця. Напр .: ПІСЛЯ ТАБЛИЦІ Співробітники ЗМІНІТЬ КОЛІНУ emName empName varchar (50) ПІСЛЯ відділу;
brianjcohen

Майте на увазі, що змінений порядок не відображатиметься в дампах SQL бази даних.
skalee

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

1
Для мене добре працює, в моєму випадку мені потрібно було визначити, що стовпець був NOT NULL DEFAULT 1, це робиться відразу після типу стовпця в прикладіVARCHAR(50)
Луїс Россі

67

Зміна положення стовпця:

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

Якщо вам потрібно перенести його на перше місце, вам слід скористатись терміном ПЕРШИЙ в кінці запиту 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 надає графічний інтерфейс для цього в структурі подання таблиці. Поставте прапорець, щоб вибрати стовпець, який потрібно перемістити, і натисніть дію зміни в нижній частині списку стовпців. Потім ви можете змінити всі властивості стовпця, і ви знайдете функцію "переміщення стовпця" в крайній правій частині екрана.

Звичайно, це все лише побудова запитів у ідеально гарній відповіді, але шанувальники GUI можуть оцінити альтернативу.

моя версія 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.