Jak przenosić kolumny w tabeli MySQL?

207

Obecnie mam następującą tabelę MySQL: Employees (empID, empName, department);

Chcę zmienić tabelę na następującą: Employees (empID, department, empName);

Jak można to zrobić za pomocą ALTERinstrukcji?

Uwaga: Chcę zmienić tylko pozycje kolumn.

sumit
źródło
Czy mogę zapytać dlaczego? Kolejność kolumn to właściwie tylko problem estetyczny ...
deceze
6
@deceze może nie - określa kolejność wartości w SELECT *instrukcji. (Oczywiście, jeśli kolejność wartości jest ważna, należy je wyraźnie wymienić w oświadczeniu, ale być może OP nie ma tutaj całkowitej kontroli).
Ted Hopp
1
Wiem, że to nic nie wpływa. Moja oryginalna tabela ma wiele kolumn, więc właśnie dodałem 3 kolumny, które zostały dodane w ostatniej. Ale chcę, aby wyświetlały się w pozycjach 3-4-5, aby ułatwić korzystanie z SELECTinstrukcji
sum
6
@iSumitG: Należy również pamiętać, że AFTER columnmożna go również używać z ALTER TABLE ADD column. (następnym razem dodasz kilka pól.)
ypercubeᵀᴹ
2
Podczas ładowania zrzutu mysql używa wstawiania do wartości. Więc jeśli na przykład ładujesz dane z prod do dev, a kolumny nie są uporządkowane, pojawi się błąd. Dlatego warto to zrobić.
Hooray Im Helping

Odpowiedzi:

345

Jeśli empName jest kolumną VARCHAR (50):

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

EDYTOWAĆ

W komentarzach możesz również to zrobić:

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

Pamiętaj, że powtórzenie empNamejest celowe. Musisz powiedzieć MySQL, że chcesz zachować tę samą nazwę kolumny.

Należy pamiętać, że obie wersje składni są specyficzne dla MySQL. Nie będą działać na przykład w PostgreSQL lub wielu innych DBMS.

Kolejna edycja: jak wskazał @Luis Rossi w komentarzu, musisz całkowicie określić zmienioną definicję kolumny tuż przed AFTERmodyfikatorem. Powyższe przykłady po prostu mają VARCHAR(50), ale jeśli potrzebujesz innych cech (takich jak NOT NULLlub wartość domyślna), musisz je również uwzględnić. Więcej informacji można znaleźć w dokumentacjiALTER TABLE .

Ted Hopp
źródło
6
Tylko uwaga: MODIFY nie jest obsługiwany do wersji 4.
Erre Efe,
4
Musisz powtórzyć nazwę kolumny, ponieważ składnia zakłada, że ​​możesz chcieć zmienić nazwę kolumny. Np .: ZMIEŃ TABELĘ Pracownicy ZMIEŃ KOLUMNĘ empName empName varchar (50) PO dziale;
brianjcohen
Należy pamiętać, że zmiana kolejności nie zostanie odzwierciedlona w zrzutach SQL bazy danych.
skalee
3
@SalehEnamShohag - Tak, zgodnie z docs The COLUMNHasło jest opcjonalne w ALTER TABLEsprawozdaniu. Wolę go używać, ponieważ uważam, że dzięki temu stwierdzenie jest bardziej czytelne.
Ted Hopp
1
Działa dla mnie dobrze, w moim przypadku musiałem zdefiniować, że kolumna była NOT NULL DEFAULT 1, dzieje się to zaraz po typie kolumny w przykładzieVARCHAR(50)
Luiz Rossi
67

Zmień pozycję kolumny:

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

Jeśli chcesz przenieść go na pierwszą pozycję, musisz użyć terminu PIERWSZY na końcu zapytania ALTER TAN CHANGE [COLUMN]:

ALTER TABLE UserOrder 
   CHANGE order_id order_id INT(11) NOT NULL FIRST;
Igor Kostin
źródło
24
Bardzo przydatne było wspomnienie, jak przenieść go na pierwszą pozycję
Tristian
2
Masz pojęcie, jak to by się działało na dużym stole? Czy to tylko zmiana niektórych metadanych, czy faktycznie musi reorganizować dane na dysku?
Kip
6
nieważne, odpowiedziałem na moje pytanie, wypróbowując je na stole, który miałem z 3,9 mln rzędów, zajęło to około 2 minut. więc zdecydowanie robi coś więcej niż tylko zamienia niektóre metadane.
Kip
14

phpMyAdmin zapewnia do tego GUI w widoku struktury tabeli. Zaznacz, aby wybrać kolumnę, którą chcesz przenieść, i kliknij akcję zmiany na dole listy kolumn. Następnie możesz zmienić wszystkie właściwości kolumny, a po prawej stronie ekranu znajdziesz funkcję „przenieś kolumnę”.

Oczywiście to wszystko tylko buduje zapytania w doskonale dobrej, górnej odpowiedzi, ale fani GUI mogą docenić alternatywę.

moja wersja phpMyAdmin to 4.1.7


źródło
1
Pytanie dotyczy konkretnie „W jaki sposób można tego dokonać za pomocą instrukcji ALTER”. Nie wszyscy korzystający z MySQL używają phpMyAdmin.
Caleb
3
Wiele się obecnie dowiaduję z wiersza poleceń, obserwując dane wyjściowe zapytania z narzędzi GUI, takich jak phpMyAdmin. Cieszę się, że ten post otrzymał tyle ocen negatywnych, ile ppl uważa za stosowne na tej podstawie: 1 osoba to zobaczy, wykona pracę w środowisku, w którym czuje się dobrze, trochę się uczy i ruszy dalej.
dla tej akcji phpmyadmi nie pokazuje polecenia wykonującego akcję. Nie znaleziono
Tebe
2
Wow, tyle gniewu na alternatywne rozwiązanie, które rozwiązuje problem i uzupełnia odpowiedzi, o które OP poprosił o ALTER SQL.
Ewen
1

Musiałem uruchomić to dla kolumny wprowadzonej w późniejszych etapach produktu, na ponad 10 stołach. Napisałem więc ten szybki nieporządny skrypt, aby wygenerować polecenie alter dla wszystkich „odpowiednich” tabel.

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);
uchamp
źródło