裏MySQLクエリー入門(16) 番外編2 ENUM型 SET型

 カテゴリーの最大数を64以下にすることが可能であれば、カンマ区切りのvarchar型のように非効率な方法ではなく、ビットをフラグとして使うことによって効率よく格納できます。

ALTER TABLE  `platform` ADD  `set_program_id` BIGINT NOT NULL COMMENT  'プログラムIDのbitセット'

UPDATE platform SET set_program_id=elt(platform_id,
(1<<1|1<<2|1<<3)>>1,
(1<<1|1<<2|1<<3)>>1,
(1<<1|1<<2|1<<3|1<<4)>>1,
(1<<4)>>1,
(1<<1|1<<2)>>1
)

SELECT platform_id,platform_name,
  MAKE_SET(set_program_id,'JAVA','ActionScript','PHP','Objective-C') set_program_id 
FROM platform

 MySQLではこのビットをフラグとして格納する方式のSET型というものがあります。内部の構造は同じな為ALTER TABLEでSET型に変更してもそのまま使用することができます。また、MAKE_SETを使用することなく自動で変換されます。

ALTER TABLE  `platform` CHANGE  `set_program_id`  `set_program_id` SET(  'JAVA',  'ActionScript',  'PHP',  'Objective-C' ) NOT NULL COMMENT  'プログラムIDのbitセット'

SELECT * FROM platform