2009-11-06 11 views
8

Tengo una tabla generada por GORM (dominio de Grails). Tiene clave/índice foráneo que generó caracteres aleatorios como FKAC7AAF67162A158F. Necesito eliminar ese campo que ya no es necesario.Cómo eliminar un índice en Grails con Liquibase

Los problemas, tengo algunos servidores que necesitan ser actualizados. Entonces necesito crear una migración usando Liquibase. Pero no tengo idea de cómo eliminar ese índice manualmente si el índice tiene un nombre aleatorio (cada servidor tiene un nombre diferente).

¿es posible soltar un índice de algo sin saber su nombre?

Respuesta

4

Puede eliminar el índice utilizando el plugin de migración de base de datos (liquibase). Requiere que conozca el nombre del índice, pero ese nombre debe estar en una de sus migraciones anteriores.

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

Cree una nueva migración para eliminar el índice.

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

También podría hacer lo siguiente: '' 'changeSet (autor:" [email protected] ", id:" 1381257863746-1 ") { sql ('DROP INDEX FKAC7AAF67162A158F') }' '' –

34

De acuerdo con la MySQL Manual ...

SHOW INDEX FROM mydb.mytable; 

devolverá información sobre el mitabla. Devuelve varios campos con información sobre la tabla y su índice, incluidos los campos Column_name y key_name. Probablemente pueda decidir cuál necesita.

Después de eso, usted debe ser capaz de ejecutar esto:

DROP INDEX index_name ON tbl_name 

Y de golpe, no más de índice.

+0

pero tengo 4 índice generado por GORM. cada índice tiene un campo diferente. así que solo necesito eliminar 1 campo solamente. otro problema, necesito crear en liquibase para que cuando se ejecute, elimine el índice. ¿Liquibase tiene "scripting lógico" como "if then else"? – nightingale2k1

+0

Déjelos todos y agregue los que desea. –

2

Si desea realizar una secuencia de comandos del índice de soltar de liqubase, necesitará hacer algunas secuencias de comandos ya que el índice de soltar estándar requiere un nombre de índice.

Una opción es usar un custom change class usando el SQL de la respuesta de Frank o acceder a los metadatos JDBC para obtener el nombre del índice real de una tabla pasada.

Otra opción sería crear un procedimiento almacenado que toma un nombre de tabla como parámetro y consulta el esquema de información para obtener el nombre de índice correcto y luego lo descarta.

0

Otra forma de hacer esto con Liquibase sería hacer lo siguiente:

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

Cuestiones relacionadas