我有一個由GORM(Grails域)生成的表。它具有生成隨機字符的外鍵/索引,如FKAC7AAF67162A158F。我需要刪除那個不再需要的字段。如何使用Liquibase刪除Grails中的索引
問題,我有一些服務器需要更新。所以我需要使用Liquibase創建一個遷移。但我不知道如果索引是隨機名稱(每個服務器我有不同的名稱),如何刪除該索引manualy。
是否可以在不知道名稱的情況下刪除某個索引?
我有一個由GORM(Grails域)生成的表。它具有生成隨機字符的外鍵/索引,如FKAC7AAF67162A158F。我需要刪除那個不再需要的字段。如何使用Liquibase刪除Grails中的索引
問題,我有一些服務器需要更新。所以我需要使用Liquibase創建一個遷移。但我不知道如果索引是隨機名稱(每個服務器我有不同的名稱),如何刪除該索引manualy。
是否可以在不知道名稱的情況下刪除某個索引?
您可以使用數據庫遷移插件(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")
}
按照MySQL Manual ...
SHOW INDEX FROM mydb.mytable;
將返回有關mytable的信息。它會返回幾個字段,其中包含關於該表及其索引的信息,包括Column_name
和key_name
字段。你大概可以理清你需要哪一個。
之後,你應該能夠執行此:
DROP INDEX index_name ON tbl_name
與繁榮,沒有更多的索引。
但我有GORM生成4個索引。每個指標有不同的領域。所以我只需要刪除1個字段。 另一個問題,我需要在liquibase上創建,所以當它執行時,它會刪除索引。 liquibase是否具有「邏輯腳本」,如「如果其他人」? – nightingale2k1 2009-11-06 15:17:29
將它們全部刪除,然後將其添加回來。 – 2013-04-23 13:35:45
如果您想要從liqubase編寫拖放索引腳本,您將需要執行一些腳本,因爲標準拖放索引需要索引名稱。
一種選擇是使用來自Frank答案的SQL使用custom change class或訪問JDBC元數據以從傳遞的表中獲取實際的索引名稱。
另一種選擇是創建一個存儲過程,該存儲過程將表名稱作爲參數並查詢information_schema以獲取正確的索引名稱,然後刪除它。
與liquibase這樣做的另一種方法是做到以下幾點:
changeSet(author: "[email protected]", id: "1381257863746-1") { sql('DROP INDEX FKAC7AAF67162A158F') }
你也可以做到以下幾點: '''變更(作者: 「[email protected]」,ID: 「1381257863746-1」){ SQL( 'DROP INDEX FKAC7AAF67162A158F') }''' – 2017-04-07 21:20:00