2009-11-06 14 views
8

Ho una tabella generata da GORM (Dominio Grails). Ha una chiave/indice straniero che ha generato caratteri casuali come FKAC7AAF67162A158F. Devo rimuovere quel campo che non è più necessario.Come eliminare un indice in Grails con Liquibase

I problemi, ho alcuni server che devono essere aggiornati. Quindi ho bisogno di creare una migrazione usando Liquibase. Ma non ho idea di come rimuovere quell'indice manualmente se l'indice è in un nome casuale (ogni server ha un nome diverso).

è possibile rilasciare un indice di qualcosa senza conoscerne il nome?

risposta

4

È possibile rimuovere l'indice utilizzando il plug-in di migrazione del database (liquibase). È necessario conoscere il nome dell'indice, ma tale nome dovrebbe essere presente in una delle precedenti migrazioni.

// older index added in a previous release 
changeSet(author: "frank", id: "1354228052849-1") { 
    createIndex(indexName: "FKAC7AAF67162A158F", tableName: "answer_option") { 
     column(name: "question_id") 
    } 
} 

Creare una nuova migrazione per rimuovere l'indice.

changeSet(author: "[email protected]", id: "1381257863746-1") { 
    dropIndex(indexName: "FKAC7AAF67162A158F", tableName: "answer_option") 
} 
+0

Si potrebbe anche effettuare le seguenti operazioni: '' 'di modifiche (autore: "[email protected]", id: "1381257863746-1") { sql ('DROP INDEX FKAC7AAF67162A158F') }' '' –

34

Secondo il MySQL Manual ...

SHOW INDEX FROM mydb.mytable; 

restituirà informazioni sulla MyTable. Restituisce diversi campi con informazioni sulla tabella e il suo indice, compresi i campi Column_name e key_name. Probabilmente puoi scegliere quale ti serve.

Dopo di che, si dovrebbe essere in grado di eseguire questo:

DROP INDEX index_name ON tbl_name 

e boom, non più indice.

+0

ma devo 4 indice generato da GORM. ogni indice ha un campo diverso. quindi ho solo bisogno di rimuovere solo un campo. un altro problema, ho bisogno di creare su liquibase così quando viene eseguito, rimuoverà l'indice. Liquibase ha "script logico" come "se poi altro"? – nightingale2k1

+0

Rilasciateli tutti e aggiungete quelli che volete. –

2

Se si desidera scrivere l'indice di rilascio da liqubase, è necessario eseguire alcuni script poiché l'indice di rilascio standard richiede un nome di indice.

Un'opzione consiste nell'utilizzare un custom change class utilizzando l'SQL dalla risposta di Frank o accedere ai metadati JDBC per ottenere il nome di indice effettivo da una tabella passata.

Un'altra opzione potrebbe essere quella di creare una stored procedure che accetta un nome di tabella come parametro e interroga l'information_schema per ottenere il nome indice corretto e quindi rilasciarlo.

0

Un altro modo di fare questo con liquibase sarebbe quella di effettuare le seguenti operazioni:

changeSet(author: "[email protected]", id: "1381257863746-1") { sql('DROP INDEX FKAC7AAF67162A158F') }

Problemi correlati