Liquibase와 함께 성배에서 색인을 삭제하는 방법
문제
Gorm (Grails Domain)에 의해 생성 된 테이블이 있습니다. fkac7aaf67162a158f와 같은 임의의 문자를 생성 한 외국 키 / 색인이 있습니다. 더 이상 필요하지 않은 필드를 제거해야합니다.
문제, 업데이트 해야하는 일부 서버가 있습니다. 따라서 Liquibase를 사용하여 이동을 만들어야합니다. 그러나 인덱스가 임의 이름 인 경우 해당 인덱스 수동을 제거하는 방법을 모르겠습니다 (각 서버마다 다른 이름이 있습니다).
이름을 모르고 무언가의 색인을 떨어 뜨릴 수 있습니까?
해결책
데이터베이스 마이그레이션 플러그인 (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")
}
다른 팁
에 따르면 MySQL 매뉴얼...
SHOW INDEX FROM mydb.mytable;
MyTable에 대한 정보를 반환합니다. 테이블과 그 인덱스에 대한 정보로 여러 필드를 반환합니다. Column_name
그리고 key_name
필드. 어떤 것이 필요한지 정리할 수 있습니다.
그 후에는 이것을 실행할 수 있어야합니다.
DROP INDEX index_name ON tbl_name
그리고 붐, 더 이상 색인이 없습니다.
Liqubase에서 드롭 인덱스를 스크립트하려면 표준 드롭 인덱스에 인덱스 이름이 필요하기 때문에 스크립팅을 수행해야합니다.
한 가지 옵션은 a를 사용하는 것입니다 사용자 정의 변경 클래스 Frank의 답변에서 SQL을 사용하거나 JDBC 메타 데이터에 액세스하여 전달 된 테이블에서 실제 색인 이름을 얻습니다.
또 다른 옵션은 테이블 이름을 매개 변수로 가져 와서 Information_Schema를 쿼리하여 올바른 색인 이름을 얻은 다음 삭제하는 저장 프로 시저를 작성하는 것입니다.
Liquibase와 함께이 작업을 수행하는 또 다른 방법은 다음을 수행하는 것입니다.
changeSet(author: "joe@example.com", id: "1381257863746-1") {
sql('DROP INDEX FKAC7AAF67162A158F')
}