문제

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') }

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top