2009-11-06 5 views
8

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

問題は、私はいくつかのサーバーを更新する必要があります。ですから、私はLiquibaseを使って移行を作成する必要があります。インデックスがランダムな名前(各サーバーに別の名前がある)にある場合は、インデックスを手動で削除する方法はわかりません。

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

答えて

4

データベース移行プラグイン(liquibase)を使用してインデックスを削除できます。インデックス名を知っている必要がありますが、その名前は以前の移行の1つにある必要があります。

// 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: "[email protected]", id: "1381257863746-1") { 
    dropIndex(indexName: "FKAC7AAF67162A158F", tableName: "answer_option") 
} 
+0

'' 'changeSet(著者:" [email protected] "、id:" 1381257863746-1 "){ sql( 'DROP INDEX FKAC7AAF67162A158F') }' '' –

34

MySQL Manualによると...

SHOW INDEX FROM mydb.mytable; 

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

その後、あなたはこれを実行することができるはずです。

DROP INDEX index_name ON tbl_name 

とブーム、これ以上のインデックス。

+0

が、私はGORMによって生成された4指標を持っています。各インデックスは異なるフィールドを持ちます。だから私は1つのフィールドだけを削除する必要があります。 別の問題は、私はliquibase上で作成する必要がありますので、実行すると、インデックスが削除されます。 liquibaseには "else then"のような "ロジックスクリプト"がありますか? – nightingale2k1

+0

それらをすべて破棄し、必要なものを戻します。 –

2

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

1つの方法は、Frankの回答からSQLを使用してcustom change classを使用するか、JDBCメタデータにアクセスして、渡されたテーブルから実際のインデックス名を取得することです。

また、テーブル名をパラメータとして使用し、正しいインデックス名を取得するためにinformation_schemaを照会してからドロップするストアドプロシージャを作成することもできます。

0

LiquiBaseをしてこれを行うためのもう一つの方法は、次の操作を行うために、次のようになります。

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

関連する問題