9

という列挙列を持つテーブルがありますaction。現在許可されている値は次のとおり act1,act2,act3,act4です。act3とを削除したいのですが、テーブルの現在の状態にはまたはact4の行が含まれていません。act3act4

新しい値のセットで列を変更しようとすると、エラーがスローされます Data Truncated for column action

必要な値を削除する方法を提案してください。

4

3 に答える 3

11

ALTER TABLE列挙値を追加するために使用することは問題なく、 MySQL のドキュメントで説明されています。

ただし、列挙値を削除する場合は、新しい列を作成して変更することをお勧めします。

ALTER TABLE your_table ADD new_action_column ENUM('act1', 'act2') ... ;
UPDATE your_table SET new_action_column = action;
ALTER TABLE your_table DROP action;
ALTER TABLE your_table CHANGE new_action_column action ENUM('act1', 'act2') ... ;

編集

ところで。を使用するENUMことは最善のアイデアではありませんINT。代わりに使用する必要があります。

MySQL の ENUM データ型が悪である 8 つの理由

次のようなマッピングを使用することをお勧めします

+------+-----+
| ENUM | INT |
+======+=====+
| act1 |  0  |
+------+-----+
| act2 |  1  |
+------+-----+
于 2012-09-26T08:56:00.067 に答える
3

最初にクエリを実行します。

UPDATE table_name SET action = '' WHERE action IN ( 'act3', 'act4' );

この後、このクエリを実行します。

ALTER TABLE table_name CHANGE action action ENUM( 'act1', 'act2' );

テーブルやフィールドを削除する必要はありません。ただし、削除したい値を持つすべてのデータを削除または更新する必要があります。

于 2012-09-26T09:02:47.947 に答える
1

他の 2 つの回答では、この質問をより詳細に説明していますが、単純に ALTER TABLE を実行できない理由簡単に説明します。ENUM('BAR','FOO','REMOVEME') があり、 Data truncated somethingsomething の行に沿って何かを示すエラーが発生する場合は、削除する Enum メンバーにエントリが既に設定されている可能性があります。したがって、最初に次のようなことをする必要があります

UPDATE yourtable SET enumrow='FOO' WHERE yourenumrow = 'REMOVEME';

このように、REMOVEME を持っていたすべてのエントリは FOO になり、次を使用してテーブルを変更できます。

ALTER TABLE yourtable CHANGE yourenumrow yourenumrow ENUM('FOO','BAR') DEFAULT NULL;

于 2016-12-04T11:58:53.880 に答える