我有一个由 GORM(Grails 域)生成的表。它具有生成随机字符的外键/索引,例如 FKAC7AAF67162A158F。我需要删除不再需要的那个字段。
问题,我有一些服务器需要更新。所以我需要使用 Liquibase 创建一个迁移。但是我不知道如果索引是随机名称(每个服务器我有不同的名称),如何手动删除该索引。
是否可以在不知道其名称的情况下删除某物的索引?
我有一个由 GORM(Grails 域)生成的表。它具有生成随机字符的外键/索引,例如 FKAC7AAF67162A158F。我需要删除不再需要的那个字段。
问题,我有一些服务器需要更新。所以我需要使用 Liquibase 创建一个迁移。但是我不知道如果索引是随机名称(每个服务器我有不同的名称),如何手动删除该索引。
是否可以在不知道其名称的情况下删除某物的索引?
根据MySQL 手册...
SHOW INDEX FROM mydb.mytable;
将返回有关 mytable 的信息。它返回几个字段,其中包含有关表及其索引的信息,包括 aColumn_name
和key_name
字段。您可能可以整理出您需要哪一个。
之后,您应该能够执行此操作:
DROP INDEX index_name ON tbl_name
繁荣,没有更多的索引。
您可以使用数据库迁移插件 (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")
}
如果您想从 liqubase 编写放置索引的脚本,则需要编写一些脚本,因为标准放置索引需要索引名称。
一种选择是使用来自 Frank's answer 的 SQL 使用自定义更改类或访问 JDBC 元数据以从传递的表中获取实际的索引名称。
另一种选择是创建一个存储过程,它以表名作为参数并查询 information_schema 以获取正确的索引名称,然后将其删除。
使用 liquibase 执行此操作的另一种方法是执行以下操作:
changeSet(author: "joe@example.com", id: "1381257863746-1") {
sql('DROP INDEX FKAC7AAF67162A158F')
}