我有一個表名爲action
的枚舉列。目前允許的值爲: act1,act2,act3,act4
。我想要刪除act3
和act4
,並且我的表的當前狀態不包含任何具有act3
或act4
的行。從mysql列刪除枚舉值
當我試圖用新的一組值修改列時,它會拋出一個錯誤 Data Truncated for column action
。
請建議如何刪除所需的值。
我有一個表名爲action
的枚舉列。目前允許的值爲: act1,act2,act3,act4
。我想要刪除act3
和act4
,並且我的表的當前狀態不包含任何具有act3
或act4
的行。從mysql列刪除枚舉值
當我試圖用新的一組值修改列時,它會拋出一個錯誤 Data Truncated for column action
。
請建議如何刪除所需的值。
使用ALTER TABLE
添加枚舉值是好的,並在MySQL documentation中描述。
但是,對於刪除枚舉值,更好的選擇是創建一個新列來執行更改。
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
代替。
8 Reasons Why MySQL's ENUM Data Type Is Evil
我建議你使用一個這樣的映射
+------+-----+
| ENUM | INT |
+======+=====+
| act1 | 0 |
+------+-----+
| act2 | 1 |
+------+-----+
」你應該用INT代替。「 - 爲什麼? – Barmar
@Barmar [MySQL的ENUM數據類型是邪惡的8個原因](http://komlenic.com/244/8-reasons-why-mysqls-enum-data-type-is-evil/)Tombom已經提到過它。我建議使用枚舉值'act1'和'act2'和int值0,1之間的映射。 –
@FlorianParain我想知道爲什麼不應該改變現有列而是添加一個臨時列。你能否推理你的陳述?謝謝! –
首先運行一個查詢。
UPDATE table_name SET action = '' WHERE action IN ('act3', 'act4');
之後運行此查詢。
ALTER TABLE table_name CHANGE action action ENUM('act1', 'act2');
有沒有必要放棄你的表或放棄你的領域。但是您需要刪除或更新所有具有要刪除的值的數據。
他說沒有任何行將被刪除。 – Barmar
我不需要做上述步驟,因爲我的表不包含'act3'和'act4'的行。錯誤仍然存在。 – mickeymoon
另外兩個答案已經在更詳細的介紹了這個問題,但這裏有一個簡單的問題,爲什麼你可能無法簡單地執行ALTER TABLE。如果你有一個ENUM('BAR','FOO','REMOVEME'),並且它給出了一個錯誤,說明某些東西沿着數據行截斷了某些東西,那麼你可能已經有一個條目設置給你想要移除的Enum成員。所以你首先需要做一些像
UPDATE yourtable SET enumrow ='FOO'WHERE yourenumrow ='REMOVEME';
這種方式,有REMOVEME現在將FOO和表可以使用
ALTER TABLE yourtable變化而改變的所有條目yourenumrow yourenumrow ENUM( '富', 'BAR')DEFAULT NULL;
也許根本不使用枚舉? http://komlenic.com/244/8-reasons-why-mysqls-enum-data-type-is-evil/ – fancyPants
顯示您的CREATE TABLE和ALTER TABLE語句。 「 –