N2-Works
WEB企画・制作/システム開発 大阪拠点

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を実現するためにトリガを使っていますが、いくらなんでも手間がかかり過ぎです。

SQLiteで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の項目が増えると記述が面倒ですが、処理がテーブル内で収まるのでマシだと思います。

[データベース]2011年07月06日 21時43分14秒

※1000文字以内で入力してください

captcha
TOP