MySQL参考手册没有提供如何做到这一点的明确示例。
我有一个enum类型的国家名称列,我需要添加更多的国家。正确的MySQL语法是什么?
以下是我的尝试:
ALTER TABLE carmake CHANGE country country ENUM('Sweden','Malaysia');
我得到的错误是:error 1265(01000):数据截断列“国家”在第1行。
国家列是上述语句中的enum类型列。
显示创建表的输出:
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)
选择不同的国家从汽车制造输出:
+----------------+
| country |
+----------------+
| Italy |
| Germany |
| England |
| USA |
| France |
| South Korea |
| NULL |
| Australia |
| Spain |
| Czech Republic |
+----------------+
还有另一种方法……
它将“others”添加到表“firmas”的列“rtipo”的枚举定义中。
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;
重要提示:这是一个遗留问题的答案
我和亚萨的讨论可能不太清楚,因为我们来来回回了很多。
我想我可以澄清我们谈话的结果,让那些未来可能面临类似情况的人受益:
enum类型的列是非常难以操作的。我想在ENUM中添加两个国家(马来西亚和瑞典)到现有的国家集合中。
似乎MySQL 5.1(这是我正在运行的)只能通过重新定义现有的集合来更新ENUM,除了我想要的:
但这并没有奏效:
ALTER TABLE carmake CHANGE country country ENUM('Sweden','Malaysia') DEFAULT NULL;
原因是MySQL语句将现有ENUM替换为另一个只包含“马来西亚”和“瑞典”条目的ENUM。MySQL抛出了一个错误,因为carmake表已经有了像“England”和“USA”这样的值,这些值不属于新的ENUM的定义。
令人惊讶的是,以下方法也不起作用:
ALTER TABLE carmake CHANGE country country ENUM('Australia','England','USA'...'Sweden','Malaysia') DEFAULT NULL;
事实证明,在向现有ENUM添加新成员时,甚至需要保留现有ENUM元素的顺序。因此,如果我现有的ENUM看起来像ENUM('英格兰','美国'),那么我的新ENUM必须定义为ENUM('英格兰','美国','瑞典','马来西亚'),而不是ENUM('美国','英格兰','瑞典','马来西亚')。只有当现有表中有使用'USA'或'England'值的记录时,这个问题才会显现出来。
底线:
只有当您不希望您的成员集在定义后更改时才使用enum。否则,查找表更容易更新和修改。
在MYSQL服务器版本:5.0.27我尝试了这个,它工作得很好,我检查在你的版本
ALTER TABLE carmake
MODIFY `country` ENUM('Japan', 'USA', 'England', 'Australia', 'Germany', 'France', 'Italy', 'Spain', 'Czech Republic', 'China', 'South Korea', 'India', 'Sweden', 'Malaysia');