BUAT INDEX vs ALTER TABLE ADD INDEX - MySQLism, atau SQL Standard?


28

Baru saja menemukan masalah aneh, di mana tergantung pada bagaimana saya membuat indeks, nama indeks diperlukan.

http://dev.mysql.com/doc/refman/5.5/id/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

Sepertinya saya bahwa panggilan CREATE INDEX, seharusnya tidak membuat nama indeks diperlukan. Saya ingin tahu apakah ini MySQLism, atau standar SQL?

Jawaban:


25

Saya tidak berpikir bahwa standar SQL mendefinisikan cara membuat indeks sama sekali .

Kutipan dari halaman Wikipedia ini :

Standardisasi

Tidak ada standar tentang membuat indeks karena ISO SQL Standard tidak mencakup aspek fisik. Indeks adalah salah satu bagian fisik dari konsepsi basis data antara lain seperti penyimpanan (tablespace atau filegroup). Semua vendor RDBMS memberikan sintaks CREATE INDEX dengan beberapa opsi spesifik yang tergantung pada fungsi yang mereka berikan kepada pelanggan.

Manual Postgres tampaknya mendukung ini di sini:

Tidak ada ketentuan untuk indeks dalam standar SQL.

Lebih banyak bukti di bawah pertanyaan terkait ini di SO.


6
MySQL adalah satu-satunya DBMS yang saya tahu yang memungkinkan menambahkan indeks secara eksplisit menggunakan ALTER TABLE(ada kasus-kasus tertentu di mana indeks implisit akan dibuat oleh berbagai DBMS untuk mendukung kendala, tapi bukan itu yang saya maksud).
a_horse_with_no_name

@a_horse_with_no_name: Dicatat dengan benar. Saya tidak mengerti mengapa MySQL memaksa kami untuk melewatkan nama_indeks, padahal jelas tidak bisa menangani nama di bawahnya. Ini adalah PITA untuk dipaksa melakukan perubahan hanya untuk menghindari penamaan indeks.
Mike Purcell

-1

Jika Anda tidak memberikan nama untuk indeks, MySQL akan secara otomatis memberi nama indeks untuk Anda.

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;

The ALTER TABLE ADD INDEXpernyataan di atas akan menghasilkan indeks berikut:

  • col1
  • col1_2
  • col2

Jika Anda membuat indeks dengan hanya satu kolom, mungkin tidak perlu memberikan nama untuk indeks (karena nama indeks akan sama dengan nama kolom). Tetapi jika Anda membuat indeks dengan beberapa kolom, mungkin lebih baik untuk memberikan nama untuk indeks sehingga akan lebih mudah untuk mengidentifikasi indeks.

Merupakan praktik yang baik untuk memberikan nama untuk indeks (dan awalan dengan idxatau sesuatu untuk mengidentifikasinya sebagai indeks):

ALTER TABLE my_table ADD INDEX idx_my_column (my_column);

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