Czy mogę zmienić nazwę wartości w kolumnie MySQL ENUM w jednym zapytaniu?
12
Załóżmy, że mam tabelę bazy danych z ENUM('value_one','value_two'). Chcę to zmienić na ENUM('First value','Second value'). Obecnie robię to w następujący sposób:
Technika, którą zamierzamy zademonstrować, jest nieobsługiwana, nieudokumentowana i może nie działać. Użyj go na własne ryzyko. Radzimy najpierw wykonać kopię zapasową danych!
Spróbuj ! (Daj nam znać, jak się okazało)
AKTUALIZACJA 2011-10-05 17:49 EDT
Jeśli tabelą jest MyISAM i masz wystarczająco dużo miejsca na produkcji oraz proste okno przestoju, spróbuj tego:
+1 za genialną odpowiedź! Nie będę jednak próbował tego i informuję, jak się to potoczyło, ponieważ pytanie dotyczy skryptu aktualizacji dla wszystkich rzeczywistych, produkcyjnych baz danych mojego klienta ;-) Mogę jednak wypróbować to w środowisku programistycznym dla zabawy. Ale z tym ostrzeżeniem nigdy nie uruchomię tego w produkcji!
Josh
3
Prostym rozwiązaniem byłoby:
1- dodaj nową kolumnę:
ALTER TABLE `table` ADD `enum2` ENUM('First value', 'Second value') NOT NULL AFTER `enum`;
2- Skopiuj wartość kolumny do enum2 z zamiennikami:
UPDATE `table` SET enum2=REPLACE(`column`, "value_one", "new value")
3- Upuść kolumnę column, zmień nazwę enumna column.
UWAGA : to pytanie z powrotem do 2011-10-05, moje rozwiązanie jest ważne dla MYSQL 4.1 i nowszych (AFAIK)
Chociaż brzmi to jak dobre rozwiązanie (i nie tak nerwowe jak zaakceptowana odpowiedź!), Warto zauważyć, że krok 3 wymaga co najmniej jednego ALTER TABLEoświadczenia, a OP szukał czegoś, co wymagało tylko jednego. To powiedziawszy, wydaje się, że jest to całkowicie standardowe, solidne rozwiązanie.
Prostym rozwiązaniem byłoby:
1- dodaj nową kolumnę:
ALTER TABLE `table` ADD `enum2` ENUM('First value', 'Second value') NOT NULL AFTER `enum`;
2- Skopiuj wartość kolumny do enum2 z zamiennikami:
UPDATE `table` SET enum2=REPLACE(`column`, "value_one", "new value")
3- Upuść kolumnę
column
, zmień nazwęenum
nacolumn
.UWAGA : to pytanie z powrotem do 2011-10-05, moje rozwiązanie jest ważne dla MYSQL 4.1 i nowszych (AFAIK)
źródło
ALTER TABLE
oświadczenia, a OP szukał czegoś, co wymagało tylko jednego. To powiedziawszy, wydaje się, że jest to całkowicie standardowe, solidne rozwiązanie.