2009-11-06 14 views
8

Mam tabeli generowane przez GORM (Grails Domain). Ma obcy klucz/indeks, który generuje losowe znaki, takie jak FKAC7AAF67162A158F. Muszę usunąć to pole, które już nie jest potrzebne.Jak usunąć indeks w Grails z Liquibase

Problemy, mam kilka serwerów, które muszą być aktualizowane. Dlatego muszę utworzyć migrację za pomocą Liquibase. Ale nie mam pojęcia, jak usunąć ten indeks ręcznie, jeśli indeks jest losowy (każdy serwer ma inną nazwę).

jest to możliwe do spadku indeksu czegoś nie znając jego nazwę?

Odpowiedz

4

można usunąć z indeksu za pomocą wtyczki bazy danych migracji (liquibase). Wymaga to znajomości nazwy indeksu, ale ta nazwa powinna znajdować się w jednej z poprzednich migracji.

// older index added in a previous release 
changeSet(author: "frank", id: "1354228052849-1") { 
    createIndex(indexName: "FKAC7AAF67162A158F", tableName: "answer_option") { 
     column(name: "question_id") 
    } 
} 

Utwórz nową migrację, aby usunąć indeks.

changeSet(author: "[email protected]", id: "1381257863746-1") { 
    dropIndex(indexName: "FKAC7AAF67162A158F", tableName: "answer_option") 
} 
+0

Można również wykonać następujące czynności: '' 'changeSet (autor:" [email protected] ", id:" 1381257863746-1 ") { sql (" INDEKS DROP FKAC7AAF67162A158F ") }' '' –

34

Według MySQL Manual ...

SHOW INDEX FROM mydb.mytable; 

zwróci informacje o MyTable. Zwraca kilka pól z informacjami o tabeli i jej indeksie, w tym o polach Column_name i key_name. Prawdopodobnie możesz wybrać, który z nich potrzebujesz.

Po tym, powinieneś być w stanie wykonać to:

DROP INDEX index_name ON tbl_name 

i bom, nie więcej indeksu.

+0

ale mam 4 indeks generowane przez GORM. każdy indeks ma inne pole. więc muszę tylko usunąć 1 pole. Kolejny problem, muszę utworzyć na liquibase, więc gdy zostanie wykonany, usunie indeks. Czy firma liquibase ma "skrypty logiczne" takie jak "jeśli jeszcze inaczej"? – nightingale2k1

+0

Upuść wszystkie i dodaj te, które chcesz. –

2

Jeśli chcąc skryptu indeks spadnie z liqubase, masz zamiar trzeba zrobić kilka włączony ponieważ standardowy wskaźnik spadku wymaga nazwę indeksu.

Jedną z opcji jest użycie custom change class przy użyciu SQL z odpowiedzi Franka lub uzyskanie dostępu do metadanych JDBC w celu uzyskania rzeczywistej nazwy indeksu z podanej tabeli.

Innym rozwiązaniem byłoby, aby utworzyć procedurę przechowywaną, która pobiera nazwę tabeli jako parametr i odpytuje information_schema aby uzyskać prawidłową nazwę indeksu, a następnie porzuca ją.

0

Innym sposobem osiągnięcia tego z liquibase byłoby wykonać następujące czynności:

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