จะย้ายคอลัมน์ในตาราง MySQL ได้อย่างไร


207

ขณะนี้ฉันมีตาราง MySQL ต่อไปนี้: Employees (empID, empName, department);

ฉันต้องการเปลี่ยนตารางเป็นดังต่อไปนี้: Employees (empID, department, empName);

สิ่งนี้สามารถทำได้โดยใช้ALTERคำสั่ง?

หมายเหตุ: ฉันต้องการเปลี่ยนเฉพาะตำแหน่งคอลัมน์


ฉันขอถามทำไม ลำดับคอลัมน์สวยมากเพียงแค่ปัญหาความงาม ...
deceze

6
@deceze อาจจะไม่ได้ - มันกำหนดลำดับของค่าในSELECT *คำสั่ง (ที่ได้รับถ้าสั่งของค่าที่เป็นสิ่งสำคัญที่หนึ่งควรแสดงไว้อย่างชัดเจนในคำสั่ง แต่บางที OP ไม่ได้มีการควบคุมทั้งหมดที่นี่.)
เท็ด Hopp

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 หรือ DBMS อื่น ๆ อีกมากมาย

การแก้ไขอื่น: ตามที่ระบุโดย @Luis Rossi ในความคิดเห็นคุณจะต้องระบุคำจำกัดความคอลัมน์ที่เปลี่ยนแปลงก่อนที่จะAFTERแก้ไข ตัวอย่างข้างต้นมีเพียงVARCHAR(50)แต่ถ้าคุณต้องการคุณสมบัติอื่น ๆ (เช่นNOT NULLหรือค่าเริ่มต้น) คุณต้องรวมสิ่งเหล่านั้นด้วย ปรึกษาเอกสารบนALTER TABLEเพื่อดูข้อมูลเพิ่มเติม


6
เพียงแค่ทราบ: MODIFY ไม่รองรับจนถึงรุ่น 4
Erre Efe

4
คุณต้องทำซ้ำชื่อคอลัมน์เนื่องจากไวยากรณ์ถือว่าคุณอาจต้องการเปลี่ยนชื่อคอลัมน์ เช่นพนักงานเปลี่ยนตารางเปลี่ยนคอลัมน์ empName empName varchar (50) แผนกหลัง;
brianjcohen

โปรดทราบว่าลำดับที่เปลี่ยนแปลงจะไม่ปรากฏในฐานข้อมูล SQL ทิ้ง
skalee

3
@SalehEnamShohag - ใช่ตามเอกสารที่COLUMNคำหลักที่เป็นตัวเลือกในALTER TABLEงบ ฉันชอบที่จะใช้เพราะฉันคิดว่ามันทำให้อ่านง่ายขึ้น
Ted Hopp

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
กล่าวถึงวิธีการย้ายไปยังตำแหน่งแรกค่อนข้างมีประโยชน์
Tristian

2
ความคิดใด ๆ วิธีนี้จะทำงานบนโต๊ะขนาดใหญ่? มันเป็นแค่การเปลี่ยนเมทาดาทาบางส่วนหรือจำเป็นต้องจัดระเบียบข้อมูลบนดิสก์ใหม่หรือไม่?
กี

6
ไม่เป็นไรตอบคำถามของฉันเองโดยลองบนโต๊ะที่ฉันมีด้วยแถว 3.9M ใช้เวลาประมาณ 2 นาที ดังนั้นมันจึงเป็นมากกว่าการแลกเปลี่ยนข้อมูลเมตา
กี

14

phpMyAdmin จัดเตรียม GUI สำหรับสิ่งนี้ภายในมุมมองโครงสร้างของตาราง เลือกเพื่อเลือกคอลัมน์ที่คุณต้องการย้ายแล้วคลิกการดำเนินการเปลี่ยนแปลงที่ด้านล่างของรายการคอลัมน์ จากนั้นคุณสามารถเปลี่ยนคุณสมบัติคอลัมน์ทั้งหมดและคุณจะพบฟังก์ชัน 'ย้ายคอลัมน์' ที่ด้านขวาสุดของหน้าจอ

แน่นอนว่านี่เป็นเพียงการสร้างคำค้นหาในคำตอบที่ดีที่สุด แต่แฟน GUI อาจชื่นชมทางเลือกอื่น

รุ่น phpMyAdmin ของฉันคือ 4.1.7


1
คำถามถามโดยเฉพาะ "สิ่งนี้สามารถทำได้โดยใช้คำสั่ง ALTER" ไม่ใช่ทุกคนที่ใช้งาน MySQL ใช้ phpMyAdmin
Caleb

3
ฉันได้เรียนรู้สิ่งที่ฉันทำอยู่ทุกวันนี้ในบรรทัดคำสั่งจากการสังเกตผลลัพธ์แบบสอบถามจากเครื่องมือ GUI เช่น phpMyAdmin ฉันมีความสุขที่โพสต์นี้จะได้รับ downvote มากเท่าที่ ppl เห็นว่าเหมาะสมบนพื้นฐานนี้: 1 คนจะเห็นสิ่งนี้รับงานของพวกเขาในสภาพแวดล้อมที่พวกเขารู้สึกสบายใจเรียนรู้เพียงเล็กน้อยและเดินหน้าต่อไป

สำหรับการดำเนินการนี้ phpmyadmi ไม่แสดงคำสั่งที่ทำการดำเนินการ ไม่พบ
Tebe

2
ว้าวโกรธมากสำหรับโซลูชันทางเลือกที่ใช้กลอุบายและชมเชยคำตอบที่ OP ร้องขอให้ ALTER SQL
Ewen

1

ฉันต้องเรียกใช้สิ่งนี้สำหรับคอลัมน์ที่เปิดตัวในระยะหลังของผลิตภัณฑ์บนตาราง 10+ ดังนั้นเขียนสคริปต์ที่ไม่เป็นระเบียบอย่างรวดเร็วเพื่อสร้างคำสั่งเปลี่ยนแปลงสำหรับตาราง 'ที่เกี่ยวข้อง' ทั้งหมด

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);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.