CREA INDICE vs ALTER TABLE AGGIUNGI INDICE - MySQLism o SQL Standard?


28

Ho appena riscontrato un problema strano, in base al quale creo un indice, è richiesto un nome di indice.

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

Mi sembra che la chiamata CREATE INDEX non debba richiedere il nome dell'indice. Mi chiedo se questo è un MySQLism o uno standard SQL?

Risposte:


25

Non credo che le definisce standard SQL come creare indici a tutti .

Una citazione da questa pagina di Wikipedia :

Standardizzazione

Non esiste uno standard sulla creazione di indici perché lo standard ISO SQL non copre gli aspetti fisici. Gli indici sono una delle parti fisiche della concezione del database, come ad esempio l'archiviazione (tablespace o filegroup). Tutti i fornitori di RDBMS forniscono una sintassi CREATE INDEX con alcune opzioni specifiche che dipendono dalle funzionalità che forniscono ai clienti.

Il manuale di Postgres sembra supportarlo qui:

Non ci sono disposizioni per gli indici nello standard SQL.

Ulteriori prove in merito a questa domanda correlata su SO.


6
MySQL è l'unico DBMS che conosco che consente di aggiungere un indice esplicito utilizzando ALTER TABLE(ci sono alcuni casi in cui gli indici impliciti verranno creati da vari DBMS per supportare i vincoli, ma non è quello che intendo).
a_horse_with_no_name il

@a_horse_with_no_name: debitamente annotato. Non capisco perché MySQL ci costringa a passare un nome_indice, quando chiaramente non può gestire nessun nome sotto. È un PITA essere costretto a fare un alter semplicemente per evitare di nominare gli indici.
Mike Purcell,

-1

Se non fornisci un nome per l'indice, MySQL nominerà automaticamente l'indice per te.

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;

Le ALTER TABLE ADD INDEXdichiarazioni sopra produrranno i seguenti indici:

  • col1
  • col1_2
  • col2

Se si crea un indice con una sola colonna, potrebbe non essere necessario fornire un nome per l'indice (poiché il nome dell'indice sarà lo stesso del nome della colonna). Ma se si crea un indice con più colonne, potrebbe essere meglio fornire un nome per l'indice, quindi sarà più facile identificare l'indice.

È buona norma fornire un nome per l'indice (e prefissarlo con idxo qualcosa per identificarlo come indice):

ALTER TABLE my_table ADD INDEX idx_my_column (my_column);

-- or
CREATE INDEX idx_my_column ON my_table (my_column);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.