Làm thế nào để di chuyển các cột trong bảng MySQL?


207

Hiện tại tôi đang có bảng MySQL sau: Employees (empID, empName, department);

Tôi muốn thay đổi bảng thành như sau: Employees (empID, department, empName);

Làm thế nào điều này có thể được thực hiện bằng cách sử dụng ALTERbáo cáo?

Lưu ý: Tôi muốn chỉ thay đổi vị trí cột.


Tôi có thể hỏi tại sao không? Thứ tự cột gần như chỉ là một vấn đề thẩm mỹ ...
lừa dối

6
@deceze có lẽ không - nó xác định thứ tự của các giá trị trong một SELECT *câu lệnh. (Được cấp, nếu thứ tự của các giá trị là quan trọng, người ta nên liệt kê chúng một cách rõ ràng trong tuyên bố, nhưng có lẽ OP không có toàn quyền kiểm soát ở đây.)
Ted Hopp

1
Tôi biết nó không ảnh hưởng gì cả. Bảng gốc của tôi có nhiều cột nên tôi chỉ cần thêm 3 cột được thêm vào cuối cùng. Nhưng tôi muốn chúng hiển thị ở các vị trí 3-4-5 để dễ dàng sử dụng SELECTcâu lệnh
sumit

6
@iSumitG: Cũng lưu ý rằng AFTER columncũng có thể được sử dụng ALTER TABLE ADD column. (cho lần tiếp theo bạn thêm một số trường.)
ypercubeᵀᴹ

2
Nếu tải một bãi chứa mysql, nó sử dụng chèn vào các giá trị. Vì vậy, nếu bạn, ví dụ, bạn đang tải dữ liệu từ prod vào dev và các cột không đúng thứ tự, bạn sẽ gặp lỗi. Đó là lý do tại sao một người có thể muốn làm điều này.
Hoan hô tôi giúp

Câu trả lời:


344

Nếu empName là cột VARCHAR (50):

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

BIÊN TẬP

Theo ý kiến, bạn cũng có thể làm điều này:

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

Lưu ý rằng sự lặp lại của empNamelà có chủ ý. Bạn phải nói với MySQL rằng bạn muốn giữ cùng tên cột.

Bạn nên lưu ý rằng cả hai phiên bản cú pháp đều dành riêng cho MySQL. Chúng sẽ không hoạt động, ví dụ, trong PostgreSQL hoặc nhiều DBMS khác.

Một chỉnh sửa khác: Như @Luis Rossi đã chỉ ra trong một bình luận, bạn cần chỉ định hoàn toàn định nghĩa cột đã thay đổi ngay trước khi AFTERsửa đổi. Các ví dụ trên chỉ có VARCHAR(50), nhưng nếu bạn cần các đặc điểm khác (chẳng hạn như NOT NULLhoặc một giá trị mặc định), bạn cũng cần bao gồm các đặc điểm đó. Tham khảo tài liệu trênALTER TABLE để biết thêm.


6
Chỉ cần một lưu ý: MODIFY không được hỗ trợ cho đến phiên bản 4.
Erre Efe

4
Bạn cần lặp lại tên cột, vì cú pháp giả định rằng bạn có thể muốn thay đổi tên cột. Ví dụ: ALTER TABLE Nhân viên THAY ĐỔI COLUMN empName empName varchar (50) SAU bộ phận;
brianjcohen

Hãy nhớ rằng thứ tự thay đổi sẽ không được phản ánh trong các bãi chứa SQL cơ sở dữ liệu.
skalee

3
@SalehEnamShohag - Có, theo các tài liệu , COLUMNtừ khóa là tùy chọn trong các ALTER TABLEcâu lệnh. Tôi thích sử dụng nó bởi vì tôi nghĩ rằng nó làm cho tuyên bố dễ đọc hơn.
Ted Hopp

1
Hoạt động tốt với tôi, trong trường hợp của tôi, tôi cần xác định rằng cột là NOT NULL DEFAULT 1, điều này được thực hiện ngay sau loại cột trong ví dụVARCHAR(50)
Luiz Rossi

67

Thay đổi vị trí cột:

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

Nếu bạn cần di chuyển nó đến vị trí đầu tiên, bạn phải sử dụng thuật ngữ FIRST ở cuối truy vấn ALTER TABLE CHANGE [COLUMN]:

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

24
Đề cập đến cách di chuyển nó đến vị trí đầu tiên khá hữu ích
Tristian

2
Bất cứ ý tưởng làm thế nào điều này sẽ thực hiện trên một bảng lớn? Có phải nó chỉ thay đổi một số siêu dữ liệu, hoặc nó thực sự phải sắp xếp lại dữ liệu trên đĩa?
Kip

6
đừng bận tâm, đã trả lời câu hỏi của riêng tôi bằng cách thử nó trên một cái bàn tôi có với 3,9 triệu hàng, mất khoảng 2 phút. Vì vậy, nó chắc chắn đang làm nhiều hơn là chỉ trao đổi một số siêu dữ liệu.
Kip

14

phpMyAdmin cung cấp GUI cho cái này trong khung nhìn cấu trúc của bảng. Kiểm tra để chọn cột bạn muốn di chuyển và nhấp vào hành động thay đổi ở cuối danh sách cột. Sau đó, bạn có thể thay đổi tất cả các thuộc tính cột và bạn sẽ tìm thấy chức năng 'di chuyển cột' ở phía bên phải màn hình.

Tất nhiên tất cả chỉ là xây dựng các truy vấn theo câu trả lời hàng đầu hoàn toàn tốt nhưng người hâm mộ GUI có thể đánh giá cao sự thay thế.

phiên bản phpMyAdmin của tôi là 4.1.7


1
Câu hỏi hỏi cụ thể "Làm thế nào điều này có thể được thực hiện bằng cách sử dụng các câu lệnh ALTER". Không phải ai đang chạy MySQL cũng sử dụng phpMyAdmin.
Caleb

3
Tôi học được nhiều điều tôi làm hiện nay tại một dòng lệnh từ việc quan sát đầu ra truy vấn từ các công cụ GUI như phpMyAdmin. Tôi rất vui vì bài đăng này nhận được nhiều lượt tải xuống như ppl thấy phù hợp trên cơ sở này: 1 người sẽ thấy điều này, hoàn thành công việc của họ trong một môi trường mà họ cảm thấy thoải mái, học hỏi một chút và tiếp tục.

Đối với hành động này, phpmyadmi không hiển thị lệnh thực hiện hành động. Không tìm thấy nó
Tebe

2
Wow, rất tức giận cho một giải pháp thay thế thực hiện thủ thuật và khen ngợi các câu trả lời mà OP yêu cầu cho SQL ALTER.
Ewen

1

Tôi đã phải chạy cái này cho một cột được giới thiệu trong các giai đoạn sau của sản phẩm, trên 10 bảng. Vì vậy, đã viết kịch bản không gọn gàng nhanh chóng này để tạo lệnh thay đổi cho tất cả các bảng 'có liên quan'.

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);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.