MySQL에서 인덱스 이름을 어떻게 바꾸나요?


82

색인의 이름을 바꾸고 싶습니다. alter table 문서를 살펴 보았지만 단순히 인덱스 이름을 바꾸는 구문을 알아낼 수 없습니다. MySQL GUI를 통해 수행 할 때 인덱스를 삭제하고 새 인덱스를 생성합니다. 이것이 작동하는 동안 인덱스 이름을 변경하기 위해 전체 인덱스를 다시 작성하는 것을 피하고 싶습니다.

[추가 정보]

alter table 문서에서 다음과 같이 말합니다.

테이블의 .frm 파일을 변경하고 테이블 내용을 건드리지 않음으로써 테이블 메타 데이터 만 수정하고 테이블 데이터는 수정하지 않을 수 있습니다. 다음 변경 사항은 이러한 방식으로 수행 할 수있는 빠른 변경입니다.

* Renaming a column or index.

그러나 테스트 데이터베이스에서 .frm 파일을 편집하고 서버를 다시 시작하여 인덱스 이름을 바꾸려고하면 이제 열을 나열하려고 할 때와 실행하려고 할 때 UI에 "Could not fetch columns"라는 메시지가 표시됩니다. 쿼리의 경우 "알 수없는 테이블 엔진 ''"오류를 반환합니다. .frm 파일에는 많은 이진 내용이 있습니다. 바이너리 정보를 편집 할 수있는 좋은 도구가 있습니까?

답변:


144

나는 2009 년에이 질문에 답했다. 그 당시 MySQL에는 인덱스 이름을 바꾸는 구문이 없었습니다.

그 이후로 MySQL 5.7은 ALTER TABLE RENAME INDEX구문을 도입했습니다 .

http://dev.mysql.com/doc/refman/5.7/en/alter-table.html 은 부분적으로 말합니다.

  • RENAME INDEX old_index_name TO new_index_name색인의 이름을 바꿉니다. 이것은 표준 SQL에 대한 MySQL 확장입니다. 테이블의 내용은 변경되지 않습니다. old_index_name동일한 ALTER TABLE명령문에 의해 삭제되지 않은 테이블에있는 기존 인덱스의 이름이어야합니다 . new_index_name변경 사항이 적용된 후 결과 테이블에서 인덱스 이름을 복제 할 수없는 새 인덱스 이름입니다. 두 인덱스 이름 모두 PRIMARY.

이전 버전의 MySQL (예 : 5.6 이하) ALTER TABLE은 인덱스 (또는 동의어 인 키)의 이름을 바꾸는 구문을 지원하지 않습니다 .

유일한 해결책은 ALTER TABLE DROP KEY oldkeyname, ADD KEY newkeyname (...).

ALTER INDEXMySQL 에는 명령 이 없습니다 . 당신은 할 수있는 DROP INDEX한 후 CREATE INDEX새로운 이름으로.


위의 업데이트와 관련하여 : 아마도 문서가 충분히 정확하지 않을 수 있습니다. 그럼에도 불구하고 인덱스의 이름을 바꾸는 SQL 구문은 없습니다.

인덱스는 데이터에서 다시 작성할 수있는 데이터 구조입니다 (사실을 사용하여 주기적으로 인덱스를 다시 작성하는 것이 좋습니다 OPTIMIZE TABLE). 시간이 좀 걸리지 만 일반적인 작업입니다. 인덱스 데이터 구조는 테이블 데이터와 분리되어 있으므로 문서에 나와있는 것처럼 인덱스를 추가하거나 삭제할 때 테이블 데이터를 건드릴 필요가 없습니다.

.frm파일 과 관련하여 MySQL은 .frm파일 편집을 지원하지 않습니다 . 나는 어떤 이유로 든하지 않을 것입니다. 테이블을 손상시키고 사용할 수 없게 만드는 것은 100 % 보장됩니다.



22
퀴즈 : SQL 표준은 인덱스에 대해 전혀 말하지 않습니다! 순전히 최적화와 관련된 공급 업체 구현 문제이므로 인덱스와 관련된 모든 구문은 모든 브랜드의 SQL 데이터베이스에서 독점적입니다.
Bill Karwin

1
네, 그게 거의 일어난 일입니다. 파일을 잘못 편집 할 때 MySQL이 충돌하기도했습니다. 올바른 것으로 표시합니다. 이상적으로는 메타 데이터 일뿐 인덱스 이름 만 바꿀 수 있지만 기능적으로는 존재하지 않는 것처럼 보입니다.
Kibbee

60

MySQL 5.7의 경우 :

ALTER TABLE tbl_name RENAME INDEX old_index_name TO new_index_name

MySQL 이전 버전의 경우 :

ALTER TABLE tbl_name DROP INDEX old_index_name, ADD INDEX new_index_name (...)

참조 http://dev.mysql.com/doc/refman/5.7/en/alter-table.html를


10
큰 테이블 인 경우 시간이 오래 걸릴 수 있으므로주의해서 새 인덱스를 삭제하고 추가하십시오. : 큰 테이블에 그것을 할 수있는 좋은 방법은 PT-온라인 스키마 변경 사용하는 것입니다 percona.com/doc/percona-toolkit/2.1/...
jbrahy

3

이 질문은 오래전에 질문되었으며 반년 전에 마지막으로 업데이트되었습니다. 그래도이 팁을 추가 할 필요가 있다고 생각합니다.

인덱싱 된 열이 다른 곳에서 외래 키로 사용되는 경우 이와 관련된 오류가 발생할 수 있습니다. 이렇게하면 도움이 될 수 있습니다.

SET FOREIGN_KEY_CHECKS = 0;
ALTER TABLE tbl DROP INDEX index_name;
ALTER TABLE tbl ADD INDEX new_index_name (indexed_column);
SET FOREIGN_KEY_CHECKS = 1;

누군가 이것이 유용하다고 생각하기를 바랍니다.


5
이 이음새가 나빠서 드롭시 순서를 바꾸고 추가 할 수 없습니까? 수표를 계속 활성화 하시겠습니까? ALTER TABLE tbl ADD INDEX new_index_name (indexed_column), DROP INDEX index_name
Puggan Se

이 5.7 이전에 MySQL을위한 가장 효율적인 / 안전한 방법입니다으로 아마이해야 그것은 자신의 대답 Puggan SE는,의
외부 참조

FK가 인덱스의 영향을받는 방식을 혼동했습니다. 데이터를 변경하는 것이 아니라 데이터의 인덱스 만 변경합니다.
gdbj

@gdbj 외래 키 제약 조건은 인덱스에 따라 달라 지므로 외래 키 제약 조건에서 사용하는 인덱스를 삭제할 수 없다고 생각합니다.
Charles Wood
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.