하나의 쿼리에서 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.