IF EXISTS(
SELECT *
FROM INFORMATION_SCHEMA.STATISTICS
WHERE INDEX_SCHEMA = DATABASE()
AND TABLE_NAME='myTable'
AND INDEX_NAME = 'myIndex')
THEN
ALTER TABLE `myTable` DROP FOREIGN KEY `myForeignKey`;
ALTER TABLE `myTable` DROP INDEX `myIndex` ;
END IF;
Quando si crea un vincolo di chiave esterna, mysql crea automaticamente un indice sulla colonna di riferimento. L'esempio sopra mostra come controllare un indice in INFORMATION_SCHEMA, ma ci sono molte più informazioni da verificare nel information schema. Il nome dell'indice sembra indicare che è stato creato per un FK, quindi prima devi rilasciare l'FK, quindi rilasciare l'indice. Se crei di nuovo la chiave esterna, mysql creerà nuovamente l'indice. Ha bisogno di un indice per rafforzare l'integrità referenziale senza dover eseguire una scansione della tabella.
Se la tua intenzione era creare un nuovo indice che contenga la stessa colonna, dovresti prima creare quell'indice (con questa colonna, quella che sarà usata come FK, essendo la prima nella lista di colonne specificate per l'indice). Ora puoi aggiungere il tuo FK e mysql sarà felice di usare il nuovo indice senza crearne un altro.
Modifica: per visualizzare rapidamente gli indici è sufficiente eseguire SHOW INDEXES da myTable;
Am utilizzando MySQL, ho cercato di mettere questo se esiste ovunque ho potuto. Come si può verificare se una chiave esterna esiste prima di rilasciarla? – Creditto
Quale motore di archiviazione mysql stai usando? MYISAM o INNODB ?? Sei sicuro di non usare MYISAM? –
AM usando il motore di memorizzazione INNODB in mysql, ho provato a mettere questo IF EXISTS ovunque potessi. Come si può verificare se una chiave esterna esiste prima di rilasciarla? – Creditto