2009-11-06 13 views
8

Ich habe eine Tabelle von GORM (Grails Domain) generiert. Es hat Fremdschlüssel/Index, der zufällige Zeichen wie FKAC7AAF67162A158F generiert. Ich muss das Feld entfernen, das nicht mehr benötigt wird.So löschen Sie einen Index in Grails mit Liquibase

Die Probleme, ich habe einige Server, die aktualisiert werden müssen. Also muss ich eine Migration mit Liquibase erstellen. Aber ich habe keine Ahnung, wie ich diesen Index manuell entfernen kann, wenn der Index einen zufälligen Namen hat (jeder Server hat einen anderen Namen).

ist es möglich, einen Index von etwas zu löschen, ohne seinen Namen zu kennen?

Antwort

4

Sie können den Index mit dem Plugin für die Datenbankmigration (liquibase) entfernen. Es erfordert, dass Sie den Indexnamen kennen, dieser Name sollte jedoch in einer Ihrer vorherigen Migrationen enthalten sein.

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

Erstellen Sie eine neue Migration, um den Index zu entfernen.

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

Sie könnten auch Folgendes tun: '' 'changeSet (Autor:" [email protected] ", ID:" 1381257863746-1 ") { sql ('DROP INDEX FKAC7AAF67162A158F') }' '' –

34

Nach dem MySQL Manual ...

SHOW INDEX FROM mydb.mytable; 

werden Informationen über die Mytable zurück. Es gibt mehrere Felder mit Informationen über die Tabelle und ihren Index zurück, einschließlich der Felder Column_name und key_name. Sie können wahrscheinlich herausfinden, welche Sie benötigen.

Danach sollten Sie in der Lage sein, dies auszuführen:

DROP INDEX index_name ON tbl_name 

Und Boom, nicht mehr Index.

+0

aber ich habe 4 Index von GORM erzeugt. Jeder Index hat ein anderes Feld. also muss ich nur 1 Feld entfernen. ein anderes Problem, ich muss auf liquibase erstellen, also wenn es ausgeführt wird, wird es den Index entfernen. Hat Liquibase "Logik Scripting" wie "wenn dann sonst"? – nightingale2k1

+0

Lassen Sie alle und fügen Sie die zurück, die Sie wollen. –

2

Wenn Sie den Drop-Index von liqubase schreiben möchten, müssen Sie einige Skripte ausführen, da der Standard-Drop-Index einen Indexnamen erfordert.

Eine Option ist die Verwendung eines custom change class mit dem SQL von Franks Antwort oder Zugriff auf die JDBC-Metadaten, um den tatsächlichen Indexnamen aus einer übergebenen Tabelle zu erhalten.

Eine andere Option wäre, eine gespeicherte Prozedur zu erstellen, die einen Tabellennamen als Parameter akzeptiert und das information_schema abfragt, um den richtigen Indexnamen zu erhalten, und diesen dann ablegt.

0

Ein anderer Weg, dies zu tun mit Liquibase wäre folgendes zu tun:

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

Verwandte Themen