8

GORM(Grailsドメイン)によって生成されたテーブルがあります。FKAC7AAF67162A158Fのようなランダムな文字を生成する外部キー/インデックスがあります。もう必要のないフィールドを削除する必要があります。

問題は、更新が必要なサーバーがいくつかあることです。そのため、Liquibaseを使用して移行を作成する必要があります。しかし、インデックスがランダムな名前である場合(サーバーごとに異なる名前が付いている場合)、そのインデックスを手動で削除する方法がわかりません。

名前を知らなくても何かのインデックスを削除することは可能ですか?

4

4 に答える 4

34

MySQLマニュアルによると...

SHOW INDEX FROM mydb.mytable;

mytableに関する情報を返します。Column_nameaフィールドやフィールドなど、テーブルとそのインデックスに関する情報を含むいくつかのフィールドを返しkey_nameます。あなたはおそらくあなたが必要とするものを整理することができます。

その後、これを実行できるようになります。

DROP INDEX index_name ON tbl_name

そしてブーム、これ以上のインデックスはありません。

于 2009-11-06T06:01:16.337 に答える
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")
}
于 2014-05-19T20:01:44.567 に答える
2

標準のドロップ インデックスにはインデックス名が必要なため、liqubase からドロップ インデックスのスクリプトを作成する場合は、スクリプトを作成する必要があります。

1 つのオプションは、フランクの回答からの SQL を使用してカスタム変更クラスを使用するか、JDBC メタデータにアクセスして、渡されたテーブルから実際のインデックス名を取得することです。

もう 1 つのオプションは、テーブル名をパラメーターとして取り、information_schema をクエリして正しいインデックス名を取得し、それを削除するストアド プロシージャを作成することです。

于 2009-11-06T07:23:28.543 に答える