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 |
+----------------+

当前回答

供参考:一个有用的模拟工具- phpMyAdmin与Wampserver 3.0.6 -预览SQL:我使用“预览SQL”来查看在保存列更改为ENUM之前将生成的SQL代码。预览SQL

上面你看到我已经输入了“福特”,“丰田”到ENUM中,但我得到的语法ENUM(0)正在生成语法错误查询错误1064#

然后复制、粘贴和修改SQL,并在SQL中运行它,得到一个积极的结果。

SQL改变

这是我经常使用的快速修复方法,也可以用于需要更改的现有ENUM值。我觉得这个可能有用。

其他回答

你的代码对我有用。下面是我的测试用例:

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');

我建议使用国家表,而不是枚举列。你可能有数百个国家,这将成为一个相当大而尴尬的enum。

编辑:现在我可以看到您的错误消息:

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定义只允许“瑞典”和“马来西亚”。表中有“USA”,“India”和其他几个。

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

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

只要你相信,这是可能的。呵呵。试试这段代码。

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

在增加新价值之前

添加新价值后

在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');
ALTER TABLE
    `table_name`
MODIFY COLUMN
    `column_name2` enum(
        'existing_value1',
        'existing_value2',
        'new_value1',
        'new_value2'
    )
NOT NULL AFTER `column_name1`;

供参考:一个有用的模拟工具- phpMyAdmin与Wampserver 3.0.6 -预览SQL:我使用“预览SQL”来查看在保存列更改为ENUM之前将生成的SQL代码。预览SQL

上面你看到我已经输入了“福特”,“丰田”到ENUM中,但我得到的语法ENUM(0)正在生成语法错误查询错误1064#

然后复制、粘贴和修改SQL,并在SQL中运行它,得到一个积极的结果。

SQL改变

这是我经常使用的快速修复方法,也可以用于需要更改的现有ENUM值。我觉得这个可能有用。