という列挙列を持つテーブルがありますaction
。現在許可されている値は次のとおり
act1,act2,act3,act4
です。act3
とを削除したいのですが、テーブルの現在の状態にはまたはact4
の行が含まれていません。act3
act4
新しい値のセットで列を変更しようとすると、エラーがスローされます
Data Truncated for column action
。
必要な値を削除する方法を提案してください。
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
。代わりに使用する必要があります。
次のようなマッピングを使用することをお勧めします
+------+-----+
| ENUM | INT |
+======+=====+
| act1 | 0 |
+------+-----+
| act2 | 1 |
+------+-----+
最初にクエリを実行します。
UPDATE table_name SET action = '' WHERE action IN ( 'act3', 'act4' );
この後、このクエリを実行します。
ALTER TABLE table_name CHANGE action action ENUM( 'act1', 'act2' );
テーブルやフィールドを削除する必要はありません。ただし、削除したい値を持つすべてのデータを削除または更新する必要があります。
他の 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;