Bagaimana cara memindahkan kolom dalam tabel MySQL?


207

Saat ini saya memiliki tabel MySQL berikut: Employees (empID, empName, department);

Saya ingin mengubah tabel sebagai berikut: Employees (empID, department, empName);

Bagaimana ini bisa dilakukan dengan menggunakan ALTERpernyataan?

Catatan: Saya hanya ingin mengubah posisi kolom.


Bolehkah saya bertanya mengapa? Urutan kolom cukup banyak hanya masalah estetika ...
deceze

6
@menerima mungkin tidak - ini mendefinisikan urutan nilai dalam SELECT *pernyataan. (Memang, jika urutan nilai-nilai itu penting, kita harus menuliskannya secara eksplisit dalam pernyataan, tetapi mungkin OP tidak memiliki kendali penuh di sini.)
Ted Hopp

1
Saya tahu itu tidak mempengaruhi apa pun. Tabel asli saya memiliki banyak kolom jadi saya baru saja menambahkan 3 kolom yang ditambahkan terakhir. Tapi saya ingin mereka tampil di posisi 3-4-5 untuk memudahkan penggunaan SELECTpernyataan
sumit

6
@ iSumitG: Perhatikan juga bahwa AFTER columndapat digunakan ALTER TABLE ADD columnjuga. (untuk kali berikutnya Anda menambahkan beberapa bidang.)
ypercubeᵀᴹ

2
Jika memuat dump mysql, ia menggunakan masukkan ke dalam nilai. Jadi jika Anda misalnya, Anda memuat data dari prod ke dev dan kolom-kolomnya rusak, Anda akan mendapatkan kesalahan. Itu sebabnya orang mungkin ingin melakukan ini.
Hooray Im Helping

Jawaban:


345

Jika empName adalah kolom VARCHAR (50):

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

EDIT

Per komentar, Anda juga dapat melakukan ini:

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

Perhatikan bahwa pengulangan empNamedisengaja. Anda harus memberi tahu MySQL bahwa Anda ingin tetap menggunakan nama kolom yang sama.

Anda harus menyadari bahwa kedua versi sintaks khusus untuk MySQL. Mereka tidak akan berfungsi, misalnya, di PostgreSQL atau banyak DBMS lainnya.

Suntingan lain: Seperti yang ditunjukkan oleh @Luis Rossi dalam komentar, Anda harus menentukan definisi kolom yang diubah tepat sebelum AFTERpengubah. Contoh-contoh di atas baru saja dimiliki VARCHAR(50), tetapi jika Anda memerlukan karakteristik lain (seperti NOT NULLatau nilai default) Anda harus memasukkannya juga. Konsultasikan pada dokumenALTER TABLE untuk info lebih lanjut.


6
Sekedar catatan: MODIFY tidak didukung hingga versi 4.
Erre Efe

4
Anda perlu mengulangi nama kolom, karena sintaks mengasumsikan Anda mungkin ingin mengubah nama kolom. Misalnya: ALTER TABEL Karyawan MENGUBAH KOLOM empName empName varchar (50) SETELAH departemen;
brianjcohen

Perlu diingat bahwa perubahan urutan tidak akan tercermin dalam database SQL dumps.
skalee

3
@SalehEnamShohag - Ya, menurut dokumen , COLUMNkata kunci opsional dalam ALTER TABLEpernyataan. Saya lebih suka menggunakannya karena saya pikir itu membuat pernyataan itu lebih mudah dibaca.
Ted Hopp

1
Bekerja dengan baik untuk saya, dalam kasus saya, saya perlu mendefinisikan bahwa kolom itu NOT NULL DEFAULT 1, ini dilakukan tepat setelah jenis kolom dalam contohVARCHAR(50)
Luiz Rossi

67

Ubah posisi kolom:

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

Jika Anda perlu memindahkannya ke posisi pertama Anda harus menggunakan istilah PERTAMA pada akhir kueri ALTER TABLE CHANGE [COLUMN]:

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

24
Menyebutkan cara memindahkannya ke posisi pertama cukup berguna
Tristian

2
Adakah yang tahu bagaimana ini akan tampil di atas meja besar? Apakah hanya mengubah beberapa metadata, atau apakah sebenarnya harus mengatur ulang data pada disk?
Kip

6
nevermind, jawab pertanyaan saya sendiri dengan mencobanya di atas meja yang saya miliki dengan baris 3,9M, butuh sekitar 2 menit. jadi sudah pasti melakukan lebih dari sekedar menukar beberapa metadata.
Kip

14

phpMyAdmin menyediakan GUI untuk ini dalam tampilan struktur tabel. Periksa untuk memilih kolom yang ingin Anda pindahkan dan klik aksi perubahan di bagian bawah daftar kolom. Anda kemudian dapat mengubah semua properti kolom dan Anda akan menemukan fungsi 'bergerak kolom' di ujung kanan layar.

Tentu saja ini semua hanya membangun pertanyaan di jawaban atas yang sangat baik tetapi penggemar GUI mungkin menghargai alternatifnya.

versi phpMyAdmin saya adalah 4.1.7


1
Pertanyaannya bertanya secara khusus "Bagaimana ini bisa dilakukan dengan menggunakan pernyataan ALTER". Tidak semua orang yang menjalankan MySQL menggunakan phpMyAdmin.
Caleb

3
Saya belajar banyak dari apa yang saya lakukan saat ini di baris perintah dari mengamati hasil permintaan dari alat GUI seperti phpMyAdmin. Saya senang posting ini mendapatkan downvotes sebanyak ppl sesuai dengan dasar ini: 1 orang akan melihat ini, menyelesaikan pekerjaan mereka di lingkungan yang mereka rasa nyaman, belajar sedikit dan terus maju.

untuk tindakan ini phpmyadmi doens't menunjukkan perintah melakukan tindakan. Tidak ditemukan
Tebe

2
Wow, sangat marah untuk solusi alternatif yang melakukan trik dan memuji jawaban yang diminta OP untuk ALTER SQL.
Ewen

1

Saya harus menjalankan ini untuk kolom yang diperkenalkan pada tahap akhir suatu produk, pada 10+ tabel. Jadi tuliskan skrip cepat yang tidak rapi ini untuk menghasilkan perintah alter untuk semua tabel 'relevan'.

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);
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.