2011-08-04 7 views
0

私の問題は:前のデータを失うことなく、SQLのみを使用してMySQLでセットタイプの列の特定の項目を有効/無効にする必要があります。セットタイプの列で設定可能な項目を1つだけ更新しますか?

擬似例:

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

OBS: 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はそうあなたがNULLかどうかを確認または文字列

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

かの場合にコンマを追加する必要はありません余分

+0

グレート "PS" を使用し、ありがとう。私はいくつかのオプションを無効にしたいのですか?たとえば、トグルを行います。オンの場合はオフ、オフの場合はオンを設定します。 –

+0

ああ、その後、 'IF'を' SWITCH'や複数の 'IF ELSE IF ELSE'(静かな殺害と維持が難しい)に広げることができます – ajreal

+0

これを解決するためのMySQLのネイティブメソッドはありませんか?タイプ "セット"はパターンがないようです。 –

0

使用CONCAT_WSですoptionです。のセットリストにあるビットは、ビット単位でビットを使用してください。

UPDATE table SET setlist = setlist | 4; 

あなたはそれを削除したい場合は、ビット単位を使用すると反転ビットセットで

UPDATE table SET setlist = setlist &~ 4; 

、あなたがオン/オフoptionを切り替えたい場合は、ビットごとのXOR

UPDATE table SET setlist = setlist^4; 
関連する問題