Làm cách nào để đổi tên một Chỉ mục trong MySQL


82

Tôi muốn đổi tên một chỉ mục. Tôi đã xem tài liệu về bảng thay đổi , nhưng tôi không thể tìm ra cú pháp để đổi tên một chỉ mục. Khi thực hiện nó thông qua MySQL GUI, nó sẽ giảm chỉ mục và tạo một chỉ mục mới. Trong khi điều này hoạt động, tôi muốn tránh xây dựng lại toàn bộ chỉ mục chỉ để thay đổi tên của chỉ mục.

[THÔNG TIN BỔ SUNG]

Trong tài liệu bảng thay đổi, nó nêu rõ

Có thể thực hiện ngay các thay đổi chỉ sửa đổi siêu dữ liệu bảng chứ không phải dữ liệu bảng bằng cách thay đổi tệp .frm của bảng và không chạm vào nội dung bảng. Những thay đổi sau là những thay đổi nhanh có thể được thực hiện theo cách này:

* Renaming a column or index.

Tuy nhiên, khi tôi cố gắng đổi tên chỉ mục bằng cách chỉnh sửa tệp .frm (trên cơ sở dữ liệu thử nghiệm) và khởi động lại máy chủ, nó hiện thông báo "Không thể tìm nạp cột" trong giao diện người dùng khi cố gắng liệt kê các cột và khi cố gắng chạy một truy vấn, nó trả về lỗi "Công cụ bảng không xác định ''". Tệp .frm có nhiều nội dung nhị phân. Có một công cụ tốt để chỉnh sửa thông tin nhị phân.

Câu trả lời:


144

Tôi đã trả lời câu hỏi này vào năm 2009. Vào thời điểm đó không có cú pháp nào trong MySQL để đổi tên một chỉ mục.

Kể từ đó, MySQL 5.7 đã giới thiệu một ALTER TABLE RENAME INDEXcú pháp.

http://dev.mysql.com/doc/refman/5.7/en/alter-table.html nói một phần:

  • RENAME INDEX old_index_name TO new_index_nameđổi tên một chỉ mục. Đây là một phần mở rộng MySQL cho SQL tiêu chuẩn. Nội dung của bảng vẫn không thay đổi. old_index_namephải là tên của một chỉ mục hiện có trong bảng không bị loại bỏ bởi cùng một ALTER TABLEcâu lệnh. new_index_namelà tên chỉ mục mới, không thể trùng lặp với tên của chỉ mục trong bảng kết quả sau khi áp dụng các thay đổi. Không thể có tên chỉ mục PRIMARY.

Các phiên bản trước của MySQL, ví dụ như 5.6 trở về trước, không hỗ trợ cú pháp nào ALTER TABLEđể đổi tên chỉ mục (hoặc khóa, là một từ đồng nghĩa).

Giải pháp duy nhất là ALTER TABLE DROP KEY oldkeyname, ADD KEY newkeyname (...).

Không có ALTER INDEXlệnh nào trong MySQL. Bạn chỉ có thể DROP INDEXvà sau đó CREATE INDEXvới tên mới.


Về bản cập nhật của bạn ở trên: có lẽ tài liệu không đủ chính xác. Bất kể, không có cú pháp SQL nào để đổi tên một chỉ mục.

Chỉ mục là một cấu trúc dữ liệu có thể được xây dựng lại từ dữ liệu (trên thực tế, bạn nên xây dựng lại các chỉ mục theo định kỳ với OPTIMIZE TABLE). Nó mất một thời gian, nhưng đó là một hoạt động phổ biến. Cấu trúc dữ liệu chỉ mục tách biệt với dữ liệu bảng, vì vậy việc thêm hoặc bớt chỉ mục không cần phải chạm vào dữ liệu bảng, như tài liệu cho biết.

Về .frmtệp, MySQL không hỗ trợ chỉnh sửa .frmtệp. Tôi sẽ không làm điều đó vì bất kỳ lý do gì. Bạn được đảm bảo 100% để làm hỏng bảng của mình và khiến nó không thể sử dụng được.



22
Thông tin bên lề: tiêu chuẩn SQL không nói gì về chỉ mục! Đó hoàn toàn là vấn đề triển khai của nhà cung cấp liên quan đến tối ưu hóa, vì vậy tất cả cú pháp liên quan đến chỉ mục đều là độc quyền, trong tất cả các nhãn hiệu của cơ sở dữ liệu SQL.
Bill Karwin

1
Vâng, đó là khá nhiều những gì đã xảy ra. Thậm chí còn khiến MySQL bị crash khi chỉnh sửa file không chính xác. Đánh dấu điều này là đúng. Lý tưởng nhất là bạn có thể đổi tên chỉ mục, vì nó chỉ là siêu dữ liệu, nhưng có vẻ như nó không tồn tại về mặt chức năng.
Kibbee 23/09/09

60

Đối với MySQL 5.7:

ALTER TABLE tbl_name RENAME INDEX old_index_name TO new_index_name

Đối với phiên bản MySQL cũ hơn:

ALTER TABLE tbl_name DROP INDEX old_index_name, ADD INDEX new_index_name (...)

Xem http://dev.mysql.com/doc/refman/5.7/en/alter-table.html


10
Hãy cẩn thận giảm bớt và thêm các chỉ mục mới, nếu đó là một bảng lớn thì có thể mất nhiều thời gian. Một cách tuyệt vời để làm điều đó trên một chiếc bàn lớn là sử dụng pt-trực tuyến-schema-change: percona.com/doc/percona-toolkit/2.1/...
jbrahy

3

Câu hỏi này đã được hỏi cách đây nhiều năm và được cập nhật lần cuối cách đây hơn nửa năm. Tôi vẫn thấy cần phải thêm mẹo này:

Nếu cột được lập chỉ mục được sử dụng ở nơi khác làm khóa ngoại, bạn có thể gặp lỗi liên quan đến điều đó. Làm điều này có thể giúp:

SET FOREIGN_KEY_CHECKS = 0;
ALTER TABLE tbl DROP INDEX index_name;
ALTER TABLE tbl ADD INDEX new_index_name (indexed_column);
SET FOREIGN_KEY_CHECKS = 1;

Hy vọng ai đó thấy điều này hữu ích.


5
Đường nối này không tốt, bạn không thể chỉ chuyển đổi thứ tự và thêm vào? và giữ cho séc hoạt động? ALTER TABLE tbl ADD INDEX new_index_name (indexed_column), DROP INDEX index_name
Puggan Se

Có lẽ nên làm cho điều này đó là câu trả lời của riêng Puggan Se, vì nó là / cách an toàn nhất hiệu quả nhất cho mysql trước 5,7
xref

Bối rối làm thế nào FK sẽ bị ảnh hưởng bởi một chỉ mục. Bạn không thay đổi dữ liệu, chỉ thay đổi chỉ mục trên dữ liệu.
gdbj

@gdbj Ràng buộc khóa ngoại phụ thuộc vào một chỉ mục, vì vậy tôi không nghĩ rằng bạn có thể bỏ một chỉ mục được sử dụng bởi ràng buộc khóa ngoại.
Charles Wood
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.