TẠO INDEX vs ALTER TABLE ADD INDEX - MySQLism, hay SQL Standard?


28

Chỉ cần gặp một vấn đề kỳ lạ, theo đó tùy thuộc vào cách tôi tạo một chỉ mục, cần có một tên chỉ mục.

http://dev.mysql.com/doc/refman/5.5/en/create-index.html

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

CREATE INDEX `random_name` ON `my_table` (`my_column`); # Requires an index name

ALTER TABLE `my_table` ADD INDEX (`my_column`); # Does not require an index name

Dường như với tôi rằng cuộc gọi CREATE INDEX, không nên đặt tên chỉ mục. Tôi đang tự hỏi nếu đây là một chủ nghĩa MySQL, hay một tiêu chuẩn SQL?

Câu trả lời:


25

Tôi không nghĩ rằng các định nghĩa tiêu chuẩn SQL như thế nào để tạo ra các chỉ số ở tất cả .

Một trích dẫn từ trang Wikipedia này :

Tiêu chuẩn hóa

Không có tiêu chuẩn nào về việc tạo các chỉ mục vì Tiêu chuẩn SQL SQL không bao gồm các khía cạnh vật lý. Các chỉ mục là một trong những phần vật lý của khái niệm cơ sở dữ liệu trong số những thứ khác như lưu trữ (không gian bảng hoặc nhóm tệp). Tất cả các nhà cung cấp RDBMS đều đưa ra cú pháp CREATE INDEX với một số tùy chọn cụ thể phụ thuộc vào chức năng họ cung cấp cho khách hàng.

Hướng dẫn Postgres dường như hỗ trợ điều này ở đây:

Không có quy định nào cho các chỉ mục trong tiêu chuẩn SQL.

Thêm bằng chứng dưới câu hỏi liên quan này về SO.


6
MySQL là DBMS duy nhất tôi biết cho phép thêm một chỉ mục rõ ràng bằng cách sử dụng ALTER TABLE(có một số trường hợp nhất định trong đó các chỉ mục ngầm sẽ được tạo bởi nhiều DBMS khác nhau để hỗ trợ các ràng buộc, nhưng đó không phải là ý tôi).
a_horse_with_no_name

@a_horse_with_no_name: Ghi chú hợp lệ. Tôi không hiểu tại sao MySQL buộc chúng ta phải vượt qua một index_name, khi rõ ràng nó có thể xử lý không có tên bên dưới. Đó là một PITA bị buộc phải thực hiện một thay đổi chỉ để tránh đặt tên chỉ mục.
Mike Purcell

-1

Nếu bạn không cung cấp tên cho chỉ mục, MySQL sẽ tự động đặt tên cho chỉ mục đó.

ALTER TABLE my_table ADD INDEX (col1);
ALTER TABLE my_table ADD INDEX (col1, col2);
ALTER TABLE my_table ADD INDEX (col2);

SHOW INDEX FROM my_table;

Các ALTER TABLE ADD INDEXtuyên bố trên sẽ tạo ra các chỉ mục sau:

  • col1
  • col1_2
  • col2

Nếu bạn tạo một chỉ mục chỉ có một cột, có thể không cần cung cấp tên cho chỉ mục (vì tên của chỉ mục sẽ giống với tên cột). Nhưng nếu bạn tạo một chỉ mục có nhiều cột, có thể tốt hơn là cung cấp tên cho chỉ mục để việc xác định chỉ mục sẽ dễ dàng hơn.

Đó là một thực tiễn tốt để cung cấp một tên cho chỉ mục (và tiền tố nó với idxhoặc một cái gì đó để xác định nó là một chỉ mục):

ALTER TABLE my_table ADD INDEX idx_my_column (my_column);

-- or
CREATE INDEX idx_my_column ON my_table (my_column);
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.