Podręcznik referencyjny MySQL nie zawiera jasnego przykładu, jak to zrobić.
Mam kolumnę typu ENUM z nazwami krajów, do której muszę dodać więcej krajów. Jaka jest prawidłowa składnia MySQL, aby to osiągnąć?
Oto moja próba:
ALTER TABLE carmake CHANGE country country ENUM('Sweden','Malaysia');
Otrzymuję błąd: ERROR 1265 (01000): Data truncated for column 'country' at row 1.
country
Kolumna jest kolumną ENUM typu w wyżej oświadczeniu.
POKAŻ STWÓRZ WYJŚCIE TABELI :
mysql> SHOW CREATE TABLE carmake;
+---------+---------------------------------------------------------------------+
| Table | Create Table
+---------+---------------------------------------------------------------------+
| carmake | CREATE TABLE `carmake` (
`carmake_id` tinyint(4) NOT NULL AUTO_INCREMENT,
`name` tinytext,
`country` enum('Japan','USA','England','Australia','Germany','France','Italy','Spain','Czech Republic','China','South Korea','India') DEFAULT NULL,
PRIMARY KEY (`carmake_id`),
KEY `name` (`name`(3))
) ENGINE=InnoDB AUTO_INCREMENT=49 DEFAULT CHARSET=latin1 |
+---------+---------------------------------------------------------------------+
1 row in set (0.00 sec)
WYBIERZ WYRÓŻNIONY kraj Z WYJŚCIA SAMOCHODU :
+----------------+
| country |
+----------------+
| Italy |
| Germany |
| England |
| USA |
| France |
| South Korea |
| NULL |
| Australia |
| Spain |
| Czech Republic |
+----------------+
mysql
enums
alter-table
Zaid
źródło
źródło
inplace
od 10.3.7: mariadb.com/kb/en/library/…Twój kod działa dla mnie. Oto mój przypadek testowy:
Jaki błąd widzisz?
FWIW to również zadziała:
Właściwie poleciłbym tabelę krajów zamiast kolumny wyliczeniowej. Możesz mieć setki krajów, co byłoby dość dużym i niezręcznym wyliczeniem.
EDYCJA: Teraz widzę Twój komunikat o błędzie:
Podejrzewam, że masz pewne wartości w kolumnie swojego kraju, które nie pojawiają się w twoim
ENUM
. Jaki jest wynik następującego polecenia?KOLEJNA EDYCJA: Jaki jest wynik następującego polecenia?
Czy to jest
STRICT_TRANS_TABLES
czySTRICT_ALL_TABLES
? Może to prowadzić do błędu, a nie zwykłego ostrzeżenia, które MySQL dałoby w tej sytuacji.JESZCZE KOLEJNA EDYCJA: Ok, teraz widzę, że na pewno masz w tabeli wartości, których nie ma w nowej
ENUM
. NowaENUM
definicja zezwala tylko na'Sweden'
i'Malaysia'
. Tabela ma'USA'
,'India'
i kilka innych.OSTATNIA EDYCJA (MOŻE): Myślę, że próbujesz to zrobić:
źródło
carmake
tabeli jest więcej niż jedna kolumna . Czy to może mieć z tym coś wspólnego?dyskusja miałem z Asafa mogą być niejasne podążać jak poszliśmy tam i z powrotem całkiem sporo.
Pomyślałem, że mógłbym wyjaśnić konsekwencje naszego dyskursu, aby inni, którzy mogą stanąć w podobnej sytuacji w przyszłości, mogli skorzystać z:
ENUM
Kolumny typu -type są bestiami bardzo trudnymi do manipulowania. Chciałem dodać dwa kraje (Malezję i Szwecję) do istniejącego zestawu krajów w moim ENUM.Wygląda na to, że MySQL 5.1 (który jest tym, co używam) może zaktualizować ENUM tylko poprzez przedefiniowanie istniejącego zestawu oprócz tego, co chcę:
To nie zadziałało:
Powodem było to, że oświadczenie MySQL został zastąpienia istniejącego ENUM z inną zawierającą wpisy
'Malaysia'
i'Sweden'
tylko. MySQL zwrócił błąd, ponieważcarmake
tabela zawierała już wartości takie jak'England'
i,'USA'
które nie były częścią nowejENUM
definicji.Co zaskakujące, następujące rozwiązania również nie działały:
Okazuje się, że nawet kolejność elementów istniejących
ENUM
trzeba zachować przy dodawaniu do niego nowych członków. Więc jeśli mój istniejącyENUM
wygląda jakośENUM('England','USA')
, to mój nowyENUM
musi być zdefiniowany jako,ENUM('England','USA','Sweden','Malaysia')
a nieENUM('USA','England','Sweden','Malaysia')
. Ten problem pojawia się tylko wtedy, gdy istnieją rekordy w istniejącej tabeli, które używają'USA'
lub'England'
wartości .LINIA DOLNA:
Używaj
ENUM
s tylko wtedy, gdy nie spodziewasz się, że Twój zestaw elementów zmieni się po zdefiniowaniu. W przeciwnym razie tabele przeglądowe są znacznie łatwiejsze do zaktualizowania i zmodyfikowania.źródło
W wersji serwera MYSQL: 5.0.27 wypróbowałem to i zadziałało dobrze dla mnie, sprawdź swoją wersję
źródło
FYI: Przydatne narzędzie do symulacji - phpMyAdmin z Wampserver 3.0.6 - Podgląd SQL: Używam „Podgląd SQL”, aby zobaczyć kod SQL, który zostałby wygenerowany przed zapisaniem kolumny ze zmianą na ENUM. Podgląd SQL
Powyżej widać, że wpisałem 'Ford', 'Toyota' do ENUM, ale otrzymuję składnię ENUM (0), która generuje błąd składni Błąd zapytania 1064 #
Następnie kopiuję i wklejam, zmieniam kod SQL i uruchamiam go przez SQL z wynikiem pozytywnym.
SQL się zmienił
Jest to szybka poprawka, której często używam i może być również używana do istniejących wartości ENUM, które należy zmienić. Pomyślałem, że to może być przydatne.
źródło
Oto inny sposób ...
Dodaje „inne” do definicji wyliczenia kolumny „rtipo” tabeli „firmas”.
źródło
Jest to możliwe, jeśli wierzysz. Hehe. wypróbuj ten kod.
Przed dodaniem nowej wartości
Po dodaniu nowej wartości
źródło