색인의 이름을 바꾸고 싶습니다. alter table 문서를 살펴 보았지만 단순히 인덱스 이름을 바꾸는 구문을 알아낼 수 없습니다. MySQL GUI를 통해 수행 할 때 인덱스를 삭제하고 새 인덱스를 생성합니다. 이것이 작동하는 동안 인덱스 이름을 변경하기 위해 전체 인덱스를 다시 작성하는 것을 피하고 싶습니다.
[추가 정보]
alter table 문서에서 다음과 같이 말합니다.
테이블의 .frm 파일을 변경하고 테이블 내용을 건드리지 않음으로써 테이블 메타 데이터 만 수정하고 테이블 데이터는 수정하지 않을 수 있습니다. 다음 변경 사항은 이러한 방식으로 수행 할 수있는 빠른 변경입니다.
* Renaming a column or index.
그러나 테스트 데이터베이스에서 .frm 파일을 편집하고 서버를 다시 시작하여 인덱스 이름을 바꾸려고하면 이제 열을 나열하려고 할 때와 실행하려고 할 때 UI에 “Could not fetch columns”라는 메시지가 표시됩니다. 쿼리의 경우 “알 수없는 테이블 엔진 ””오류를 반환합니다. .frm 파일에는 많은 이진 내용이 있습니다. 바이너리 정보를 편집 할 수있는 좋은 도구가 있습니까?
답변
나는 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 INDEX
MySQL 에는 명령 이 없습니다 . 당신은 할 수있는 DROP INDEX
한 후 CREATE INDEX
새로운 이름으로.
위의 업데이트와 관련하여 : 아마도 문서가 충분히 정확하지 않을 수 있습니다. 그럼에도 불구하고 인덱스의 이름을 바꾸는 SQL 구문은 없습니다.
인덱스는 데이터에서 다시 작성할 수있는 데이터 구조입니다 (사실을 사용하여 주기적으로 인덱스를 다시 작성하는 것이 좋습니다 OPTIMIZE TABLE
). 시간이 좀 걸리지 만 일반적인 작업입니다. 인덱스 데이터 구조는 테이블 데이터와 분리되어 있으므로 문서에 나와있는 것처럼 인덱스를 추가하거나 삭제할 때 테이블 데이터를 건드릴 필요가 없습니다.
.frm
파일 과 관련하여 MySQL은 .frm
파일 편집을 지원하지 않습니다 . 나는 어떤 이유로 든하지 않을 것입니다. 테이블을 손상시키고 사용할 수 없게 만드는 것은 100 % 보장됩니다.
답변
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 (...)
답변
이 질문은 오래전에 질문되었으며 반년 전에 마지막으로 업데이트되었습니다. 그래도이 팁을 추가 할 필요가 있다고 생각합니다.
인덱싱 된 열이 다른 곳에서 외래 키로 사용되는 경우 이와 관련된 오류가 발생할 수 있습니다. 이렇게하면 도움이 될 수 있습니다.
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;
누군가 이것이 유용하다고 생각하기를 바랍니다.