it-swarm.com.de

Wie füge ich meiner ENUM-Spalte in MySQL weitere Mitglieder hinzu?

Das MySQL-Referenzhandbuch enthält kein klares Beispiel dafür.

Ich habe eine ENUM-artige Spalte mit Ländernamen, zu der ich weitere Länder hinzufügen muss. Was ist die korrekte MySQL-Syntax, um dies zu erreichen?

Hier ist mein Versuch:

ALTER TABLE carmake CHANGE country country ENUM('Sweden','Malaysia');

Der Fehler, den ich erhalte, ist: ERROR 1265 (01000): Data truncated for column 'country' at row 1.

Die Spalte country ist die Spalte vom Typ ENUM in der obigen Anweisung.

SHOW CREATE TABLE anzeigen AUSGABE:

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 EINZELNES Land AUS KAFFEE AUSGABE:

+----------------+
| country        |
+----------------+
| Italy          |
| Germany        |
| England        |
| USA            |
| France         |
| South Korea    |
| NULL           |
| Australia      |
| Spain          |
| Czech Republic |
+----------------+
130
Zaid
ALTER TABLE
    `table_name`
MODIFY COLUMN
    `column_name2` enum(
        'existing_value1',
        'existing_value2',
        'new_value1',
        'new_value2'
    )
NOT NULL AFTER `column_name1`;
83

Ihr Code funktioniert für mich. Hier ist mein Testfall:

mysql> CREATE TABLE carmake (country ENUM('Canada', 'United States'));
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW CREATE TABLE carmake;
+---------+-------------------------------------------------------------------------------------------------------------------------+
| Table   | Create Table                                                                                                            |
+---------+-------------------------------------------------------------------------------------------------------------------------+
| carmake | CREATE TABLE `carmake` (
  `country` enum('Canada','United States') default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 |
+---------+-------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> ALTER TABLE carmake CHANGE country country ENUM('Sweden','Malaysia');
Query OK, 0 rows affected (0.53 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> SHOW CREATE TABLE carmake;
+---------+--------------------------------------------------------------------------------------------------------------------+
| Table   | Create Table                                                                                                       |
+---------+--------------------------------------------------------------------------------------------------------------------+
| carmake | CREATE TABLE `carmake` (
  `country` enum('Sweden','Malaysia') default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 |
+---------+--------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

Welchen Fehler siehst du?

FWIW würde das auch funktionieren:

ALTER TABLE carmake MODIFY COLUMN country ENUM('Sweden','Malaysia');

Eigentlich würde ich eher eine Ländertabelle als eine Aufzählungsspalte empfehlen. Möglicherweise haben Sie Hunderte von Ländern, die für eine ziemlich große und unangenehme Aufzählung sorgen würden.

EDIT: Jetzt kann ich Ihre Fehlermeldung sehen:

ERROR 1265 (01000): Data truncated for column 'country' at row 1.

Ich vermute, Sie haben einige Werte in Ihrer Länderspalte, die nicht in Ihrem ENUM erscheinen. Was ist die Ausgabe des folgenden Befehls?

SELECT DISTINCT country FROM carmake;

NOCH EINMAL BEARBEITEN: Was ist die Ausgabe des folgenden Befehls?

SHOW VARIABLES LIKE 'sql_mode';

Ist es STRICT_TRANS_TABLES oder STRICT_ALL_TABLES? Das könnte zu einem Fehler führen, anstatt der üblichen Warnung, die MySQL in dieser Situation ausgibt.

NOCH EINE ANDERE BEARBEITUNG: Ok, ich sehe jetzt, dass Sie definitiv Werte in der Tabelle haben, die nicht in dem neuen ENUM sind. Die neue ENUM Definition erlaubt nur 'Sweden' und 'Malaysia'. Die Tabelle enthält 'USA', 'India' und mehrere andere.

LAST EDIT (möglicherweise): Ich denke, Sie versuchen dies zu tun:

ALTER TABLE carmake CHANGE country country ENUM('Italy', 'Germany', 'England', 'USA', 'France', 'South Korea', 'Australia', 'Spain', 'Czech Republic', 'Sweden', 'Malaysia') DEFAULT NULL;
95
Asaph

Die Diskussion , die ich mit Asaph hatte, könnte unklar sein, da wir ziemlich viel hin und her gingen.

Ich dachte, ich könnte das Ergebnis unseres Diskurses für andere, die in der Zukunft ähnlichen Situationen gegenüberstehen könnten, klären, um davon zu profitieren:

ENUM- Typspalten sind sehr schwer zu manipulieren. Ich wollte zwei Länder (Malaysia und Schweden) zu den bestehenden Ländern in meinem ENUM hinzufügen.

Es scheint, dass MySQL 5.1 (was ich ausführte) das ENUM nur aktualisieren kann, indem es zusätzlich zu dem, was ich möchte, den vorhandenen Satz neu definiert:

Das hat nicht funktioniert:

ALTER TABLE carmake CHANGE country country ENUM('Sweden','Malaysia') DEFAULT NULL;

Der Grund war, dass die MySQL-Anweisung das vorhandene ENUM durch ein anderes ersetzt, das nur die Einträge 'Malaysia' und 'Sweden' enthält. MySQL hat einen Fehler gemeldet, da die carmake-Tabelle bereits Werte wie 'England' und 'USA' hatte, die nicht Teil der neuen ENUM-Definition waren.

Überraschenderweise funktionierte auch Folgendes nicht:

ALTER TABLE carmake CHANGE country country ENUM('Australia','England','USA'...'Sweden','Malaysia') DEFAULT NULL;

Es stellt sich heraus, dass sogar die Reihenfolge der Elemente der vorhandenen ENUM beibehalten werden muss, während neue Mitglieder hinzugefügt werden. Wenn also meine ENUM so aussieht wie ENUM('England','USA'), muss meine neue ENUM als ENUM('England','USA','Sweden','Malaysia') und nicht als ENUM('USA','England','Sweden','Malaysia') definiert werden. Dieses Problem tritt nur dann auf, wenn in der vorhandenen Tabelle Datensätze vorhanden sind, die 'USA'- oder 'England'-Werte verwenden.

ENDEFFEKT:

Verwenden Sie ENUMs nur, wenn Sie nicht erwarten, dass sich Ihre Mitgliedermenge ändert, sobald sie definiert ist. Ansonsten können Lookup-Tabellen viel einfacher aktualisiert und geändert werden.

72
Zaid

In MySQL-Server-Version: 5.0.27 habe ich dies versucht und es funktionierte gut für mich, wenn Sie Ihre Version einchecken

ALTER TABLE carmake
     MODIFY `country` ENUM('Japan', 'USA', 'England', 'Australia', 'Germany', 'France', 'Italy', 'Spain', 'Czech Republic', 'China', 'South Korea', 'India', 'Sweden', 'Malaysia');
2
Abhishek

Hier ist ein anderer Weg ...

Es fügt der Enumendefinition der Spalte "rtipo" der Tabelle "firmas" andere hinzu.

set @new_enum = 'others';
set @table_name = 'firmas';
set @column_name = 'rtipo';
select column_type into @tmp from information_schema.columns 
  where table_name = @table_name and [email protected]_name;
set @tmp = insert(@tmp, instr(@tmp,')'), 0, concat(',\'', @new_enum, '\'') );
set @tmp = concat('alter table ', @table_name, ' modify ', @column_name, ' ', @tmp);
prepare stmt from @tmp;
execute stmt;
deallocate prepare stmt;
1
Antonio

Zu Ihrer Information: Ein nützliches Simulationswerkzeug - phpMyAdmin mit Wampserver 3.0.6 - Preview SQL: Ich verwende 'Preview SQL', um den SQL-Code anzuzeigen, der generiert werden würde, bevor Sie die Spalte mit der Änderung in ENUM speichern. Vorschau SQL

Oben sehen Sie, dass ich 'Ford', 'Toyota' in das ENUM eingegeben habe, aber ich bekomme die Syntax ENUM (0), die einen Syntaxfehler generiert. Abfragefehler 1064 #

Dann kopiere und füge ich die SQL ein und ändere sie und führe sie mit einem positiven Ergebnis durch SQL.

SQL geändert

Dies ist ein Quickfix, den ich häufig verwende. Er kann auch für vorhandene ENUM-Werte verwendet werden, die geändert werden müssen. Ich denke, das könnte nützlich sein.

0
Addi