Das MySQL-Referenzhandbuch enthält kein eindeutiges Beispiel dafür.
Ich habe eine ENUM-Spalte mit Ländernamen, zu denen ich weitere Länder hinzufügen muss. Was ist die richtige MySQL-Syntax, um dies zu erreichen?
Hier ist mein Versuch:
ALTER TABLE carmake CHANGE country country ENUM('Sweden','Malaysia');
Der Fehler, den ich bekomme, ist: ERROR 1265 (01000): Data truncated for column 'country' at row 1.
Die country
Spalte ist die Spalte vom Typ ENUM in der obigen Anweisung.
SHOW CREATE TABLE OUTPUT:
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)
WÄHLEN SIE EIN UNTERSCHIEDLICHES LAND AUS DER Carmake-AUSGABE:
+----------------+
| country |
+----------------+
| Italy |
| Germany |
| England |
| USA |
| France |
| South Korea |
| NULL |
| Australia |
| Spain |
| Czech Republic |
+----------------+
mysql
enums
alter-table
Zaid
quelle
quelle
inplace
seit 10.3.7 erfolgen: mariadb.com/kb/en/library/…Ihr Code funktioniert für mich. Hier ist mein Testfall:
Welchen Fehler sehen Sie?
FWIW das würde auch funktionieren:
Ich würde eigentlich eher eine Ländertabelle als eine Aufzählungsspalte empfehlen. Möglicherweise haben Sie Hunderte von Ländern, die zu einer ziemlich großen und umständlichen Aufzählung führen würden.
EDIT: Jetzt, wo ich Ihre Fehlermeldung sehen kann:
Ich vermute, Sie haben einige Werte in Ihrer Länderspalte, die nicht in Ihrer angezeigt werden
ENUM
. Was ist die Ausgabe des folgenden Befehls?EINE ANDERE BEARBEITUNG: Was ist die Ausgabe des folgenden Befehls?
Ist es
STRICT_TRANS_TABLES
oderSTRICT_ALL_TABLES
? Dies könnte zu einem Fehler führen und nicht zu der üblichen Warnung, die MySQL in dieser Situation geben würde.NOCH EINE ANDERE BEARBEITUNG: Ok, ich sehe jetzt, dass Sie definitiv Werte in der Tabelle haben, die nicht in der neuen sind
ENUM
. Die neueENUM
Definition erlaubt nur'Sweden'
und'Malaysia'
. Die Tabelle hat'USA'
,'India'
und einige andere.LAST EDIT (MÖGLICHERWEISE): Ich denke, Sie versuchen dies zu tun:
quelle
carmake
Tabelle. Könnte das etwas damit zu tun haben?Die Diskussion, die ich mit Asaph geführt habe, ist möglicherweise unklar, da wir ziemlich viel hin und her gingen.
Ich dachte, ich könnte das Ergebnis unseres Diskurses für andere klarstellen, die in Zukunft möglicherweise mit ähnlichen Situationen konfrontiert sind, um davon zu profitieren:
ENUM
Spalten vom Typ sind sehr schwer zu manipulierende Bestien. Ich wollte zwei Länder (Malaysia und Schweden) zu den bestehenden Ländern in meiner ENUM hinzufügen.Es scheint, dass MySQL 5.1 (das ist, was ich ausführe) die ENUM nur aktualisieren kann, indem das vorhandene Set zusätzlich zu dem, was ich will, neu definiert wird:
Das hat nicht funktioniert:
Der Grund dafür war , dass die MySQL - Anweisung wurde ersetzt die bestehende ENUM mit einem anderen die Einträge enthält ,
'Malaysia'
und'Sweden'
nur. MySQL hat einen Fehler ausgegeben, da diecarmake
Tabelle bereits Werte wie'England'
und'USA'
enthielt, die nicht Teil derENUM
Definition des neuen waren .Überraschenderweise funktionierte auch Folgendes nicht:
Es stellt sich heraus, dass auch die Reihenfolge der Elemente des vorhandenen
ENUM
beibehalten werden muss, während neue Mitglieder hinzugefügt werden. Wenn mein bestehendesENUM
ungefähr so aussiehtENUM('England','USA')
, muss mein neuesENUM
definiert werden alsENUM('England','USA','Sweden','Malaysia')
und nichtENUM('USA','England','Sweden','Malaysia')
. Dieses Problem wird nur manifestieren , wenn es Datensätze in der vorhandenen Tabelle , dass die Verwendung'USA'
oder'England'
Werte.ENDEFFEKT:
Verwenden Sie
ENUM
s nur, wenn Sie nicht erwarten, dass sich Ihre Mitglieder nach der Definition ändern. Andernfalls lassen sich Nachschlagetabellen viel einfacher aktualisieren und ändern.quelle
In MYSQL Server Version: 5.0.27 habe ich dies versucht und es hat gut funktioniert, wenn ich Ihre Version einchecke
quelle
Zu Ihrer Information: Ein nützliches Simulationswerkzeug - phpMyAdmin mit Wampserver 3.0.6 - SQL-Vorschau: Ich verwende 'SQL-Vorschau', um den SQL-Code anzuzeigen, der generiert wird, bevor Sie die Spalte mit der Änderung in ENUM speichern. Vorschau von SQL
Oben sehen Sie, dass ich 'Ford', 'Toyota' in die ENUM eingegeben habe, aber die Syntax ENUM (0) erhalte, die einen Syntaxfehler generiert. Abfragefehler 1064 #
Ich kopiere und füge dann das SQL ein und ändere es und führe es mit einem positiven Ergebnis durch SQL.
SQL geändert
Dies ist ein Quickfix, den ich häufig verwende und der auch für vorhandene ENUM-Werte verwendet werden kann, die geändert werden müssen. Dachte, das könnte nützlich sein.
quelle
Hier ist ein anderer Weg ...
Es fügt "andere" zur Aufzählungsdefinition der Spalte "rtipo" der Tabelle "firmas" hinzu.
quelle
Es ist möglich, wenn Sie glauben. Hehe. Versuchen Sie diesen Code.
Vor dem Hinzufügen eines neuen Werts
Nach dem Hinzufügen eines neuen Wertes
quelle