Как удалить индекс в Grails с помощью Liquibase

У меня есть таблица, сгенерированная GORM (домен Grails). Он имеет внешний ключ / индекс, который генерирует случайные символы, такие как FKAC7AAF67162A158F. Мне нужно удалить это поле, которое больше не нужно.

проблемы, у меня есть несколько серверов, которые необходимо обновить. Поэтому мне нужно создать миграцию с помощью Liquibase. Но я понятия не имею, как удалить этот индекс вручную, если индекс находится в случайном имени (каждый сервер имеет другое имя).

можно ли сбросить индекс что-то, не зная его имени ?

4 ответов


вы можете удалить индекс, используя плагин миграции базы данных (liquibase). Это требует, чтобы вы знали имя индекса, но это имя должно быть в одном из ваших предыдущих миграций.

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

создайте новую миграцию для удаления индекса.

changeSet(author: "joe@example.com", id: "1381257863746-1") {
    dropIndex(indexName: "FKAC7AAF67162A158F", tableName: "answer_option")
}

по словам Руководство MySQL...

SHOW INDEX FROM mydb.mytable;

вернет информацию о mytable. Он возвращает несколько полей с информацией о таблице и ее индексе, включая Column_name и key_name поля. Вы, вероятно, можете решить, какой из них вам нужен.

после этого вы сможете выполнить следующее:

DROP INDEX index_name ON tbl_name

и бум, больше нет индекса.


Если вы хотите написать индекс падения из liqubase, вам нужно будет сделать некоторые сценарии, так как стандартный индекс падения требует имени индекса.

один из вариантов-это использовать пользовательский класс изменения использование SQL из ответа Фрэнка или доступ к метаданным JDBC, чтобы получить фактическое имя индекса из переданной таблицы.

другой вариант-создать хранимую процедуру, которая принимает имя таблицы в качестве параметра и запрашивает information_schema, чтобы получить правильное имя индекса, а затем отбрасывает его.


другим способом сделать это с liquibase было бы сделать следующее:

changeSet(author: "joe@example.com", id: "1381257863746-1") { sql('DROP INDEX FKAC7AAF67162A158F') }