如何在MySQL中的ENUMtypes列中添加更多成员?

MySQL参考手册没有提供一个清楚的例子来说明如何做到这一点。

我有一个ENUMtypes的国家名称列,我需要添加更多的国家。 什么是正确的MySQL语法来实现呢?

这是我的尝试:

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

我得到的错误是: ERROR 1265 (01000): Data truncated for column 'country' at row 1.

country列是上述声明中的ENUMtypes列。

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 country FROM carmake OUTPUT:

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

你的代码适合我。 这是我的testing案例:

 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) 

你看到什么错误?

FWIW这也将工作:

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

我实际上会推荐一个国家表而不是枚举列。 你可能会有数百个国家会造成一个相当大和笨拙的枚举。

编辑:现在,我可以看到你的错误信息:

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

我怀疑你的国家/地区栏中有一些值没有出现在你的ENUM 。 以下命令的输出是什么?

 SELECT DISTINCT country FROM carmake; 

另一个编辑:以下命令的输出是什么?

 SHOW VARIABLES LIKE 'sql_mode'; 

STRICT_TRANS_TABLES还是STRICT_ALL_TABLES ? 这可能会导致一个错误,而不是在这种情况下MySQL会给你的通常的警告。

还有一个编辑:好吧,我现在看到,你肯定有不在新的ENUM表中的值。 新的ENUM定义只允许'Sweden''Malaysia' 。 桌子上有'USA''India'等等。

最后编辑(可能):我想你正在尝试这样做:

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

我们与阿萨夫的讨论可能不清楚,因为我们来回走了很多。

我认为我可以澄清我们的话语的结果,为将来可能面临类似情况的其他人从中受益:

ENUM型柱是非常难操纵的野兽。 我想在我的ENUM中增加两个国家(马来西亚和瑞典)到现有的一些国家。

看来,MySQL 5.1(这是我正在运行)只能通过重新定义现有的设置,除了我想要的以外,更新ENUM:

这不起作用:

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

原因在于MySQL声明只是将现有的ENUMreplace为仅包含条目'Malaysia''Sweden'的条目。 MySQL抛出一个错误,因为carmake表已经有像'England''USA'这些不属于新ENUM定义的值。

令人惊讶的是,以下也没有工作:

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

事实certificate,即使现有的ENUM元素的顺序也需要在添加新成员的同时保留。 因此,如果我现有的ENUM看起来像ENUM('England','USA') ,那么我的新ENUM必须被定义为ENUM('England','USA','Sweden','Malaysia')而不是ENUM('USA','England','Sweden','Malaysia') 。 只有在现有表中使用'USA''England'值的logging时,才会出现此问题。

底线:

只有当您不希望您的成员集定义更改时才使用ENUM 。 否则,查找表更容易更新和修改。

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

如果你相信,这是可能的。 呵呵。 试试这个代码。

 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)"); } 

在添加新的价值之前

添加新的值后