UTWÓRZ INDEKS vs ALTER TABELA DODAJ INDEKS - MySQLism czy SQL Standard?


28

Właśnie natknąłem się na dziwny problem, w którym w zależności od sposobu utworzenia indeksu wymagana jest nazwa indeksu.

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

Wydaje mi się, że wywołanie CREATE INDEX nie powinno wymagać podania nazwy indeksu. Zastanawiam się, czy jest to MySQLism, czy standard SQL?

Odpowiedzi:


25

Nie sądzę, że standard SQL w ogóle definiuje sposób tworzenia indeksów .

Cytat z tej strony Wikipedii :

Normalizacja

Nie ma standardu dotyczącego tworzenia indeksów, ponieważ standard ISO SQL nie obejmuje aspektów fizycznych. Indeksy to jedna z fizycznych części koncepcji bazy danych, między innymi pamięć (obszar tabel lub aplikacjami). Wszyscy dostawcy RDBMS udostępniają składnię CREATE INDEX z pewnymi konkretnymi opcjami, które zależą od funkcjonalności, które zapewniają klientom.

Wydaje się, że instrukcja Postgres obsługuje to tutaj:

Nie ma rezerw na indeksy w standardzie SQL.

Więcej dowodów na to powiązane pytanie dotyczące SO.


6
MySQL to jedyny znany mi DBMS, który pozwala na dodanie jawnego indeksu ALTER TABLE(istnieją pewne przypadki, w których różne DBMS utworzą indeksy niejawne w celu obsługi ograniczeń, ale nie o to mi chodzi).
a_horse_w_no_name

@a_horse_with_no_name: Należy zauważyć. Nie rozumiem, dlaczego MySQL zmusza nas do przekazania nazwy_indeksu, skoro wyraźnie nie obsługuje żadnej nazwy pod spodem. PITA musi być zmuszona do zmiany po prostu w celu uniknięcia indeksowania nazw.
Mike Purcell,

-1

Jeśli nie podasz nazwy indeksu, MySQL automatycznie nada mu nazwę.

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;

Powyższe ALTER TABLE ADD INDEXinstrukcje wygenerują następujące indeksy:

  • col1
  • col1_2
  • col2

Jeśli utworzysz indeks tylko z jedną kolumną, może nie być konieczne podanie nazwy indeksu (ponieważ nazwa indeksu będzie taka sama jak nazwa kolumny). Ale jeśli utworzysz indeks z wieloma kolumnami, lepiej podać nazwę indeksu, aby łatwiej było go zidentyfikować.

Dobrą praktyką jest podanie nazwy indeksu (i prefiks idxlub identyfikacja indeksu):

ALTER TABLE my_table ADD INDEX idx_my_column (my_column);

-- or
CREATE INDEX idx_my_column ON my_table (my_column);
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.