하나의 쿼리에서 MySQL ENUM 열의 값 이름을 바꿀 수 있습니까?


12

가있는 데이터베이스 테이블이 있다고 가정하십시오 ENUM('value_one','value_two'). 로 변경하고 싶습니다 ENUM('First value','Second value'). 나는 현재 다음과 같이하고있다 :

ALTER TABLE `table` MODIFY `column` ENUM('value_one','value_two','First value','Second value');
UPDATE `table` SET `column`='First Value' WHERE `column`='value_one';
UPDATE `table` SET `column`='Second Value' WHERE `column`='value_two';
ALTER TABLE `table` MODIFY `column` ENUM('First value','Second value');

이것을 수행하는 더 효율적인 방법이 있습니까, EG 하나의 ALTER TABLE 진술로 이것을 달성하는 방법 입니까?

답변:


10

제가 보여 드리려는 다음과 같은 기술은 강철 용기가 필요할 것입니다.

다음 기준을 감안할 때

  • datadir은 /var/lib/mysql
  • 테이블은 mydb.mytb
  • 라는 열거 열이 enum_col
  • 엔진은 MyISAM입니다

여기에 치명적인 균열이 있습니다.

  1. CREATE TABLE mydb.mybt LIKE mydb.mytb;

  2. ALTER TABLE mydb.mybt MODIFY enum_col ENUM('First value','Second value');

  3. SET wait_timeout=86400; SET interactive_timeout=86400;

  4. FLUSH TABLES WITH READ LOCK;

  5. 별도의 OS / SSH 세션에서 .frm 파일을 교체하십시오.

    • $ mv /var/lib/mysql/mydb/mytb.frm /var/lib/mysql/mydb/myxx.frm
    • $ mv /var/lib/mysql/mydb/mybt.frm /var/lib/mysql/mydb/mytb.frm
    • $ mv /var/lib/mysql/mydb/myxx.frm /var/lib/mysql/mydb/mybt.frm
  6. UNLOCK TABLES;

  7. DROP TABLE mydb.mybt;

그게 다야!

주의 사항 : 나는 이것에 대한 신용을 취할 수 없습니다!

이 기술은 "고성능 MySQL : 최적화, 백업, 복제 등", 146-148 페이지의 하위 제목 Speeding Up ALTER 표 아래에 있습니다. 단락 1은 다음과 같이 말합니다.

우리가 설명하려는 기술은 지원되지 않고 문서화되지 않았으며 작동하지 않을 수 있습니다. 위험에 따라 사용하십시오. 먼저 데이터를 백업하는 것이 좋습니다!

시도 해봐 ! (어떻게 밝혀 졌는지 알려주십시오)

업데이트 2011-10-05 17:49 EDT

테이블이 MyISAM이고 프로덕션 공간이 충분하고 가동 중지 시간이 짧은 경우 다음을 시도하십시오.

  1. service mysql restart --skip-networking

  2. 별도의 OS / SSH 세션에서 테이블 사본을 작성하십시오.

    • cp /var/lib/mysql/mydb/mytb.frm /var/lib/mysql/mydb/mytbplay.frm
    • cp /var/lib/mysql/mydb/mytb.MYD /var/lib/mysql/mydb/mytbplay.MYD
    • cp /var/lib/mysql/mydb/mytb.MYI /var/lib/mysql/mydb/mytbplay.MYI

INFORMATION_SCHEMA.TABLES라는 새 테이블이 있는지 자동으로 감지합니다 mydb.mytbplay.

  1. 스틸 내장 알고리즘 수행 mydb.mytbplay

  2. 당신은 무결성을 테스트 mydb.mytbplay

당신이 만족한다면

  1. ALTER TABLE mydb.mytb RENAME mydb.mytb_backup;

  2. ALTER TABLE mydb.mytbplay RENAME mydb.mytb;

  3. service mysql restart

시도 해봐!


독창적 인 답변을 위해 +1! 그러나 나는 이것을 시도하지 않고 질문이 내 고객의 모든 실제 프로덕션 데이터베이스에 대한 업그레이드 스크립트를 나타내는 것으로 밝혀 졌음을 알릴 것입니다 .-) 그러나 개발 환경에서 시도해 볼 수 있습니다. 재미 로요 그러나 그 경고로 나는 이것을 프로덕션에서 결코 실행하지 않을 것입니다!
— Josh

3

간단한 해결책은 다음과 같습니다.

1- 새 열을 추가하십시오.

ALTER TABLE `table` ADD `enum2` ENUM('First value', 'Second value') NOT NULL AFTER `enum`;

2- 대체 값으로 열 값을 enum2에 복사하십시오.

UPDATE `table` SET enum2=REPLACE(`column`, "value_one", "new value")

3 열을 삭제 column하고로 이름 enum을 바꿉니다 column.

참고 :이 질문은 2011-10-05로 돌아가서 내 솔루션은 MYSQL 4.1 이상 (AFAIK)에 유효합니다


이것은 좋은 해결책처럼 들리지만 (허용되는 대답만큼 신경을 쓰지 않는 것입니다!), 3 단계에는 적어도 하나의 ALTER TABLE진술 이 필요하며 OP는 하나만 필요한 것을 찾고 있음을 주목할 가치가 있습니다. 다시 말하지만, 그것은 완벽하게 표준적이고 견고한 솔루션처럼 보입니다.
— RDFozz
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.