web-dev-qa-db-ja.com

MySQLのENUMタイプの列にさらにメンバーを追加するにはどうすればよいですか?

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

あなたのコードは私のために機能します。これが私のテストケースです。

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

まだ別の編集:OK、テーブルに新しいENUMにはない値が間違いなくあることがわかりました。新しいENUM定義では、'Sweden'および'Malaysia'のみが許可されます。テーブルには、'USA''India'、および他のいくつかがあります。

最後の編集(MAYBE):これをやろうとしていると思う:

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

discussion Asaphで行ったことは、かなり頻繁に行ったり来たりしたため、従うのが不明確かもしれません。

私は、将来同様の状況に直面する可能性のある他の人たちのために、私たちの談話の結果を明確にするかもしれないと考えました:

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

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

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

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

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

驚くべきことに、以下も機能しませんでした。

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

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

ボトムライン:

一度定義されたメンバーのセットが変更されると思われない場合にのみ、ENUMsを使用してください。それ以外の場合、ルックアップテーブルの更新と変更ははるかに簡単です。

72
Zaid

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

ここに別の方法があります...

テーブル「firmas」の列「rtipo」の列挙定義に「others」を追加します。

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;
1
Antonio

参考:便利なシミュレーションツール-Wampserver 3.0.6を使用したphpMyAdmin-プレビューSQL:「プレビューSQL」を使用して、ENUMへの変更で列を保存する前に生成されるSQLコードを確認します。 SQLのプレビュー

上記のように、ENUMに「Ford」、「Toyota」を入力しましたが、構文エラーを生成している構文ENUM(0)を取得しています Query error 1064#

次に、SQLをコピーして貼り付けて変更し、SQLを実行して肯定的な結果を得ました。

SQLの変更

これは頻繁に使用するクイックフィックスであり、変更が必要な既存のENUM値にも使用できます。これは役に立つかもしれないと思った。

0
Addi