MySQLのSET型を使ってみようとしてやめた時のメモ。
ドキュメント→ http://dev.mysql.com/doc/refman/5.6/en/set.html
作ったテーブルはこんなの。
CREATE TABLE `Color` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`flags` set('red','blue','green') DEFAULT NULL,
`name` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `flags_INDEX` (`flags`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
下記のデータを突っ込んで、試します
INSERT Color (flags, name) VALUES
('red', '赤'),
('blue', '青'),
('green', '緑'),
('red,blue', '紫'),
('red,green', '黄'),
('blue,green', '水'),
('red,blue,green', '白');
flags に blue を含んだものを取得したい場合
SELECT * FROM Color WHERE FIND_IN_SET('blue', flags);
# id, flags, name
2, blue, 青
4, red,blue, 紫
6, blue,green, 水
7, red,blue,green, 白
なんでやめたの
上のクエリ、インデックスが効くわけじゃないんです。like 句を使っても書ける とドキュメントにあるんだけど、そっち使って書いても駄目。
一応、blue or red,blue or blue,green or red,blue,green みたいな書き方をすると効くんだけど、いやいやいや……。
フラグが増えたらALTER TABLEなのかとかも気になったし、とても古い記事だけど 使うべきじゃない という記事も読んでしまい、結局使うのをやめました。まぁ利用用途次第ですかね。