2016-10-08 9 views
1

私は効率的にMySQLのレコードのビットフラグを保存し、効率的に操作したいと思います。 SETデータ型は、最大64個のフラグが単一の数値として格納されるため、最初の願いを満たします。しかし、第二はどうですか?高速バイナリ操作でMySQLでSETデータ型を操作する方法は?

UPDATE table_name SET set_col = (set_col | 4) WHERE condition; 
UPDATE table_name SET set_col = (set_col & ~4) WHERE condition; 

のような厄介な解決策だけが、値にメンバーを含めたり除外したりするのを見ました。私。数値定数を使用する必要があります。これはコードをメンテナンス不能にします。次に、INTのデータ型も使用できました。 set_colの定義が変更された場合(可能なメンバーの追加、削除、または並べ替え)には、ハードコードされた定数を持つコードが混乱します。数値的な定数ではなく、メンテナンスを容易にするだけでなく、完全なエラーを防ぐという名前の変数をアプリケーション言語で使用するようにコーダーでいくつかの規律を施すことができます。 MySQLが集合メンバの記号名を正しい数値に解決する解決策がありますか?例えば。これは動作しません:

UPDATE person SET tag=tag | 'MGR' 

を役に立たない答えを食い止めるために、私は、データベースの正規化と別々メートル対nの関係テーブルについて知っている、それはここでは話題ではありません。あなたはより具体的な例が必要な場合は、ここにいます:セットの定義に

CREATE TABLE `coder` (
    `name` VARCHAR(50) NOT NULL, 
    `languages` SET('Perl','PHP','Java','Scala') NOT NULL 
) 

変更「のPerl5」と「Perl6の」に「Perlを」分割するように、多分隔年思いも寄らないしかし、可能です。

答えて

0

は、私はここで答えを見つけました:4月12日にジョン・Kozura投稿者 https://dev.mysql.com/doc/refman/5.7/en/set.html

、MySQLは、少なくとも 5.1+、余分なカンマでうまく扱うように見えることを2011

注意を、 「適切な」リストを作成せずに、個々のビットを名前で設定/削除することは非常に簡単です。したがって、切り捨てられたデータの警告を気にしなければ、SET flags = ',,, foo ,, bar ,,のようなものでもうまくいきます。

は、ビットを追加します。

UPDATE tbl SET flags=CONCAT_WS(',', flags, 'flagtoadd'); 

はビットを削除します。

UPDATE tbl SET flags=REPLACE(flags, 'flagtoremove', '') 

を..その後、

UPDATE tbl SET flags=REPLACE(CONCAT(',', flags, ','), ',foo,', ',') 

警告があなたから問題を引き起こすならば、:あなたが持っている場合や名前だビットは少し複雑 「foo」と「足」のような別のビットのサブネームであり、

追加:

UPDATE tbl SET flags=TRIM(',' FROM CONCAT(flags, ',', 'flagtoadd')) 
ソリューションは、仕事上の を掲載しました削除

UPDATE tbl SET flags=TRIM(',' FROM REPLACE(CONCAT(',', flags, ','), ',flagtoremove,', ',')) 
+0

これは、まだ整数演算 '列十分ではありません| 4096'と'コラム&〜128単位がはるかに高速です。 – MKaama

関連する問題