代码之家  ›  专栏  ›  技术社区  ›  nightingale2k1

如何用liquibase删除Grails中的索引

  •  8
  • nightingale2k1  · 技术社区  · 15 年前

    我有一个由gorm(grails域)生成的表。它有生成随机字符(如fkac7aaf67162a158f)的外键/索引。我需要删除不再需要的字段。

    问题是,我有一些服务器需要更新。所以我需要使用liquibase创建一个迁移。但是,如果索引是随机名称(每个服务器的名称都不同),我不知道如何手动删除该索引。

    是否可以在不知道某个对象的名称的情况下删除该对象的索引?

    4 回复  |  直到 7 年前
        1
  •  4
  •   Jay Prall    9 年前

    可以使用数据库迁移插件(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")
    }
    
        2
  •  34
  •   Frank DeRosa    15 年前

    根据 MySQL Manual

    SHOW INDEX FROM mydb.mytable;
    

    将返回有关MyTable的信息。它返回几个字段,其中包含有关表及其索引的信息,包括 Column_name key_name 领域。你可能会找出你需要哪一个。

    之后,您应该能够执行以下操作:

    DROP INDEX index_name ON tbl_name
    

    繁荣,不再是指数。

        3
  •  2
  •   Nathan Voxland    15 年前

    如果您想从利口基编写DROP索引的脚本,则需要执行一些脚本,因为标准的DROP索引需要索引名。

    一种选择是使用 custom change class 使用来自Frank答案的SQL或访问JDBC元数据从传递的表中获取实际的索引名。

    另一个选项是创建一个以表名为参数的存储过程,并查询信息模式以获取正确的索引名,然后删除它。

        4
  •  0
  •   Spencer Powell    7 年前

    使用Liquibase执行此操作的另一种方法是执行以下操作:

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