3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

MySQLのSET型を使ってみようとしてやめた

Last updated at Posted at 2014-12-11

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なのかとかも気になったし、とても古い記事だけど 使うべきじゃない という記事も読んでしまい、結局使うのをやめました。まぁ利用用途次第ですかね。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?