Frage

Das MySQL-Referenzhandbuch bietet keinen clearcut Beispiel dafür, wie dies zu tun.

Ich habe eine ENUM-Typ Spalte von Ländernamen, die ich brauche, um weitere Länder hinzuzufügen. Was ist die korrekte Syntax MySQL dies zu erreichen?

Hier ist mein Versuch:

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

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

Die country Spalte ist die ENUM-Typ Spalte in der obenen Aussage.

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)

SELECT DISTINCT Land FROM carmake OUTPUT:

+----------------+
| country        |
+----------------+
| Italy          |
| Germany        |
| England        |
| USA            |
| France         |
| South Korea    |
| NULL           |
| Australia      |
| Spain          |
| Czech Republic |
+----------------+
War es hilfreich?

Lösung

ALTER TABLE
    `table_name`
MODIFY COLUMN
    `column_name2` enum(
        'existing_value1',
        'existing_value2',
        'new_value1',
        'new_value2'
    )
NOT NULL AFTER `column_name1`;

Andere Tipps

Der 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)

Welche Fehler sehen Sie?

FWIW dies würde auch funktionieren:

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

Ich möchte einen Tisch Land tatsächlich empfehlen, statt ENUM-Spalte. Sie können Hunderte von Ländern haben, die für ein ziemlich großes und umständlich Enum machen würde.

EDIT: Nun, da ich Ihre Fehlermeldung sehen:

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

Ich vermute, Sie haben einige Werte in Ihrem Land Spalte, die in Ihrem ENUM nicht erscheinen. Was ist die Ausgabe des folgenden Befehls?

SELECT DISTINCT country FROM carmake;

ANOTHER EDIT: Was ist die Ausgabe des folgenden Befehls

SHOW VARIABLES LIKE 'sql_mode';

Ist es STRICT_TRANS_TABLES oder STRICT_ALL_TABLES? Das zu einem Fehler führen könnte, anstatt die übliche Warnung MySQL Sie in dieser Situation geben würde.

YET ANOTHER EDIT: Ok, ich sehe jetzt, dass Sie auf jeden Fall Werte in der Tabelle, die nicht in dem neuen ENUM ist. Die neue ENUM Definition erlaubt nur 'Sweden' und 'Malaysia'. Die Tabelle hat 'USA', 'India' und einige andere.

LAST EDIT (vielleicht): Ich glaube, 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;

Hier ist eine andere Art und Weise ...

Sie fügt hinzu, "andere" die ENUM-Definition der Spalte "rtipo" der Tabelle "firmas".

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 column_name=@column_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;

Zur Info: Eine nützliche Simulationswerkzeug - phpMyAdmin mit Wampserver 3.0.6 - Preview SQL: Ich verwende ‚Vorschau SQL‘, um den SQL-Code zu sehen, die erzeugt werden würden, bevor Sie die Spalte mit der Änderung des ENUM speichern. Vorschau SQL

Oben sehen Sie, dass ich eingegeben 'Ford', 'Toyota' in die ENUM aber ich bin immer Syntax ENUM (0), die Syntaxfehler erzeugt Abfrage-Fehler 1064 #

ich dann kopieren und einfügen und die SQL ändern und es durch SQL mit einem positiven Ergebnis führen.

SQL geändert

Dies ist ein quickfix, die ich häufig verwenden und kann auch auf bestehende ENUM-Werte verwendet werden, die geändert werden müssen. Dachte, könnte dies nützlich sein.

Es ist möglich, wenn Sie glauben. Hehe. versuchen, diesen Code.

public function add_new_enum($new_value)
  {
    $table="product";
    $column="category";
         $row = $this->db->query("SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
        WHERE TABLE_NAME = ? AND COLUMN_NAME = ?", array($table, $column))->row_array();

    $old_category = array();
    $new_category="";
    foreach (explode(',', str_replace("'", '', substr($row['COLUMN_TYPE'], 5, (strlen($row['COLUMN_TYPE']) - 6)))) as $val)
    {
        //getting the old category first

        $old_category[$val] = $val;
        $new_category.="'".$old_category[$val]."'".",";
    }

     //after the end of foreach, add the $new_value to $new_category

      $new_category.="'".$new_value."'";

    //Then alter the table column with the new enum

    $this->db->query("ALTER TABLE product CHANGE category category ENUM($new_category)");
  }

Bevor neuen Wert Hinzufügen

Nach neuem Wert Hinzufügen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top