SQLiteでENUM風なカラムを定義する
WebアプリケーションではMySQLを使うことが多いのですが、スマホアプリ開発ではSQLiteを使用しています。
SQLiteではテーブル定義をするにも結構制限があります。
その一つが表題の「ENUM」です。
ENUMは列挙した値以外を挿入しようとするとエラーを返します。
MySQLでは以下のようなSQLを発行するとエラーになります。
MySQL
CREATE TABLE IF NOT EXISTS `t_sample` (
`ID` VARCHAR(10) NOT NULL,
`ENUMカラム` ENUM('値1', '値2') NOT NULL DEFAULT '値1',
PRIMARY KEY(`ID`)
);
INSERT INTO `t_sample`(`ID`, `ENUMカラム`) VALUES('sample', '値3');
このように挿入できる値を制限するのがENUMの役目です。
SQLiteにはENUMはありませんが、同様の動作を再現することは可能です。
以下の記事ではENUMを実現するためにトリガを使っていますが、いくらなんでも手間がかかり過ぎです。
他にやり方はないかと考えてみるとCHECK制約で入力値を制限できることに気づきました。
SQLite
CREATE TABLE IF NOT EXISTS 't_sample' (
'ID' VARCHAR(10) NOT NULL,
'ENUMカラム' TEXT collate BINARY NOT NULL DEFAULT '値1',
PRIMARY KEY(`ID`),
CHECK (ENUMカラム = '値1' OR ENUMカラム = '値2')
);
INSERT INTO 't_sample'('ID', 'ENUMカラム') VALUES('sample', '値3');
この方法でもENUMの項目が増えると記述が面倒ですが、処理がテーブル内で収まるのでマシだと思います。