198

MySQLリファレンスマニュアルには、これを行う方法の明確な例が記載されていません。

国を追加する必要がある国名のENUMタイプの列があります。これを実現するための正しいMySQL構文は何ですか?

これが私の試みです:

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

私が得るエラーは次のとおりです。ERROR 1265 (01000): Data truncated for column 'country' at row 1.

このcountry列は、上記のステートメントのENUMタイプの列です。

CREATE TABLEの出力を表示します:

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)

carmakeの出力から異なる国を選択してください

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

7 に答える 7

184
ALTER TABLE
    `table_name`
MODIFY COLUMN
    `column_name2` enum(
        'existing_value1',
        'existing_value2',
        'new_value1',
        'new_value2'
    )
NOT NULL AFTER `column_name1`;
于 2016-11-11T16:00:00.370 に答える
103

あなたのコードは私のために働きます。これが私のテストケースです:

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 がこの状況で出す通常の警告ではなく、エラーにつながる可能性があります。

さらに別の編集: わかりました。 new にない値が table に確実にあることがわかりました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;
于 2009-10-01T05:07:25.243 に答える
75

私がAsaphと行った議論は、私たちがかなり行ったり来たりしたので、従うのが不明確かもしれません。

私は、将来同様の状況に直面する可能性のある他の人々が恩恵を受けるために、私たちの談話の結果を明らかにするかもしれないと思いました。

ENUM-タイプの列は、操作が非常に難しい獣です。ENUMの既存の国のセットに2つの国(マレーシアとスウェーデン)を追加したかったのです。

MySQL 5.1(私が実行しているもの)は、必要なものに加えて既存のセットを再定義することによってのみENUMを更新できるようです。

これは機能しませんでした:

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

その理由は、MySQLステートメントが既存のENUMを、エントリのみ'Malaysia'を含む別のENUMに置き換えていたためです。テーブルにはすでにのような値があり、新しいの定義の一部ではなかっ'Sweden'たため、MySQLはエラーをスローしました。carmake'England''USA'ENUM

驚いたことに、次のいずれも機能しませんでした。

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

新しいメンバーを追加する間、既存の要素の順序さえもENUM維持する必要があることがわかりました。したがって、既存ENUMのものがのように見える場合ENUM('England','USA')、新しいものはとしてではなくENUMとして定義する必要があります。この問題は、または値を使用する既存のテーブルにレコードがある場合にのみ明らかになります。ENUM('England','USA','Sweden','Malaysia')ENUM('USA','England','Sweden','Malaysia')'USA''England'

ボトムライン:

ENUM一度定義したメンバーのセットが変更されることを期待しない場合にのみ、sを使用してください。そうしないと、ルックアップテーブルの更新と変更がはるかに簡単になります。

于 2009-10-02T10:51:56.433 に答える
-14

信じれば可能です。へへ。このコードを試してください。

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

新しい価値を加える前に

新たな価値を付加した上で

于 2016-03-07T20:30:01.767 に答える