2011-08-04 24 views
0

我的問題是:我需要在MySQL上只使用SQL來啓用/禁用特定項目的set type列,而不會丟失以前的數據。只更新設置類型列上的一個可設置項目?

僞例如:

UPDATE `table` 
    SET `setlist` = TOGGLE_SET(`setlist`, 'option_a`, true) 
    WHERE `id` = 1 
    LIMIT 1 

實驗值: TOGGLE_SET(列數據,字符串選項,布爾模式)是假的方法,不存在,只是爲了瞭解。

創建例如:

CREATE TABLE `table` (
     `id` INT(10) UNSIGNED NULL AUTO_INCREMENT, 
     `setlist` SET('option_a', 'option_b') NULL DEFAULT NULL, 
     PRIMARY KEY (`id`) 
    ) 
    ENGINE=InnoDB; 

插入例如:

INSERT INTO `table` (`id`, `setlist`) VALUES (1, 'option_b'); 

類似的更新例如:

UPDATE `table` 
    SET `setlist` = 'option_a,option_b' 
    WHERE `id` = 1 
    LIMIT 1 

這一切!

回答

2
set setlist=if(setlist is null, 'option_a', concat(setlist,',option_a')); 

PS - 列id是獨一無二的,limit 1是多餘的

+0

大「PS」,謝謝。如果我想禁用某些選項?例如,做一個切換:如果開啓,設置關閉,如果關閉,則設置爲開啓。 –

+0

哦,那麼你可以將'IF'擴展爲'SWITCH'或者多個'IF ELSE IF ELSE'(安靜查殺和難以維護) – ajreal

+0

MySQL沒有本地方法可以解決這個問題嗎?看起來類型「set」是無模式的。 –

0

使用CONCAT_WS,這樣你就不必檢查NULL或逗號添加到字符串

UPDATE table SET setlist = CONCAT_WS(",", setlist, "option"); 

,或者如果您option第三個元素在您的setlist中使用該位按位或

UPDATE table SET setlist = setlist | 4; 

,如果你想刪除它,使用位與,倒位集

UPDATE table SET setlist = setlist &~ 4; 

,如果你想切換上option /關,使用按位異或

UPDATE table SET setlist = setlist^4;