2012-09-26 51 views
7

我有一個表名爲action的枚舉列。目前允許的值爲: act1,act2,act3,act4。我想要刪除act3act4,並且我的表的當前狀態不包含任何具有act3act4的行。從mysql列刪除枚舉值

當我試圖用新的一組值修改列時,它會拋出一個錯誤 Data Truncated for column action

請建議如何刪除所需的值。

+0

也許根本不使用枚舉? http://komlenic.com/244/8-reasons-why-mysqls-enum-data-type-is-evil/ – fancyPants

+0

顯示您的CREATE TABLE和ALTER TABLE語句。 「 –

回答

9

使用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 | 
+------+-----+ 
+0

」你應該用INT代替。「 - 爲什麼? – Barmar

+0

@Barmar [MySQL的ENUM數據類型是邪惡的8個原因](http://komlenic.com/244/8-reasons-why-mysqls-enum-data-type-is-evil/)Tombom已經提到過它。我建議使用枚舉值'act1'和'act2'和int值0,1之間的映射。 –

+0

@FlorianParain我想知道爲什麼不應該改變現有列而是添加一個臨時列。你能否推理你的陳述?謝謝! –

2

首先運行一個查詢。

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

之後運行此查詢。

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

有沒有必要放棄你的表或放棄你的領域。但是您需要刪除或更新所有具有要刪除的值的數據。

+0

他說沒有任何行將被刪除。 – Barmar

+0

我不需要做上述步驟,因爲我的表不包含'act3'和'act4'的行。錯誤仍然存​​在。 – mickeymoon

0

另外兩個答案已經在更詳細的介紹了這個問題,但這裏有一個簡單的問題,爲什麼可能無法簡單地執行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;