2009-11-06 73 views
8

我有一個由GORM(Grails域)生成的表。它具有生成隨機字符的外鍵/索引,如FKAC7AAF67162A158F。我需要刪除那個不再需要的字段。如何使用Liquibase刪除Grails中的索引

問題,我有一些服務器需要更新。所以我需要使用Liquibase創建一個遷移。但我不知道如果索引是隨機名稱(每個服務器我有不同的名稱),如何刪除該索引manualy。

是否可以在不知道名稱的情況下刪除某個索引?

回答

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

你也可以做到以下幾點: '''變更(作者: 「[email protected]」,ID: 「1381257863746-1」){ SQL( 'DROP INDEX FKAC7AAF67162A158F') }''' – 2017-04-07 21:20:00

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是否具有「邏輯腳本」,如「如果其他人」? – nightingale2k1 2009-11-06 15:17:29

+0

將它們全部刪除,然後將其添加回來。 – 2013-04-23 13:35:45

2

如果您想要從liqubase編寫拖放索引腳本,您將需要執行一些腳本,因爲標準拖放索引需要索引名稱。

一種選擇是使用來自Frank答案的SQL使用custom change class或訪問JDBC元數據以從傳遞的表中獲取實際的索引名稱。

另一種選擇是創建一個存儲過程,該存儲過程將表名稱作爲參數並查詢information_schema以獲取正確的索引名稱,然後刪除它。

0

與liquibase這樣做的另一種方法是做到以下幾點:

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