2012-02-20 25 views

答えて

10

これはあなたが探しているものであれば、私はわからないんだけど、あなたは何ができるだろうが、チェック制約を使用です:

CREATE TABLE My_Table(my_column varchar(255) 
    check (my_column in ('first', 'second', 'last'))); 

-- fails: 
insert into My_Table values('x'); 

-- ok: 
insert into My_Table values('first'); 

これはH2、Apache Derbyの、PostgreSQLの、HSQLDB、およびに動作しますSQLiteさえ。私は他のデータベースをテストしなかった。

+0

ところで、列挙型と参照テーブルがより効率的である可能性があります。 –

+0

この解決策では可能な値を列挙する方法がない(彼は必要ないかもしれないが)。 – Viruzzo

+0

可能な値がわからないということですか?どのようにenumを使うことができますか?あなたの例は正しいですか? –

7

ありません。それでも、enumはいずれの場合でも最適な解決策ではありません。参照表を使用するだけです。

+6

+1は "enumは素晴らしい解決策ではありません" –

2

私はこの問題に遭遇し、別のテーブルと外部キー制約を作成して解決しました。

あなたはそれはあなたが挿入している値が My_Enum_Tableであることを確認するために、外部キーチェックを行います My_TableINSERTをしようとする方法
CREATE TABLE My_Enum_Table (
    my_column varchar(255) UNIQUE 
); 

INSERT INTO My_Enum_Table (my_column) 
VALUES 
    ('First'), 
    ('Second'), 
    ... 
    ('Last'); 

CREATE TABLE My_Table (
    my_column varchar(255), 
    FOREIGN KEY (my_column) REFERENCES My_Enum_Table (my_column) 
); 

はここにかかわらず、いくつかのトレードオフがあります。

  • PROS
    • あなたはまだこれであなたはENUMと同じように対話することができます。
    • また、テーブル定義を変更することなく別の値を追加できるという点で、少し柔軟性があります。
  • CONS
    • それはテーブルルックアップを行う必要がありますので、これはおそらくENUMよりも遅くなります。現実的には、テーブルの行数がかなり少なくなければならないが、これはおそらくごくわずかである。 My_Table.my_columnにインデックスを追加すると、これが役に立ちます。
    • これにより、参照テーブルとの結合の必要性がなくなりますが、データベースの観点からは基本的に同じレベルの複雑さがあります。データベースを別のテーブルで混乱させることを心配している場合を除き、これは大きな問題ではありません。
    • これには、INNODBなどの外部キーをサポートするエンジンを使用する必要もあります。私はこれが本当にコンですが、私はそれが特別なニーズを持つ人のためかもしれないと思うかどうかは分かりません。
1

H2は、列挙型があるように見える:http://www.h2database.com/html/datatypes.html#enum_type

だから、まったく同じ構文が動作するはずですが。 (私はどのようにセマンティクスが一致するかわかりません。)

+0

現在、[バージョン1.4.195 **の時点で、2017-04-23にリリースされました](http://www.h2database.com/html/changelog.html)はサポートされていますが、その質問は書かれました。たぶんあなたはあなたの答えを明確にしたいでしょう。 –

関連する問題