如何在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)"); }
在添加新的价值之前
添加新的值后