この質問に続いて、「データベースの列挙 - 長所と短所」、どのデータベース システムが列挙型データ型をサポートしているか、およびそれらがどのようにそれを行うかについて少し詳しく知りたいです (たとえば、内部に格納されているもの、制限は何か、クエリ構文の影響、インデックス作成の影響など)。
ユースケースまたは長所と短所についての議論は、他の質問で行う必要があります。
この質問に続いて、「データベースの列挙 - 長所と短所」、どのデータベース システムが列挙型データ型をサポートしているか、およびそれらがどのようにそれを行うかについて少し詳しく知りたいです (たとえば、内部に格納されているもの、制限は何か、クエリ構文の影響、インデックス作成の影響など)。
ユースケースまたは長所と短所についての議論は、他の質問で行う必要があります。
MySQLがENUMをサポートしていることを知っています。
SELECT enum_col+0
」からアクセスできます。ENUM('0','1','2')
になるため、避ける必要があります'0'
1
PostgreSQLは8.3以降のENUMをサポートしています。古いバージョンの場合は、次を使用できます。
次のような操作を行うことで、ENUMをシミュレートできます。
CREATE TABLE persons (
person_id int not null primary key,
favourite_colour varchar(255) NOT NULL,
CHECK (favourite_colour IN ('red', 'blue', 'yellow', 'purple'))
);
あなたも持つことができます:
CREATE TABLE colours (
colour_id int not null primary key,
colour varchar(255) not null
)
CREATE TABLE persons (
person_id int not null primary key,
favourite_colour_id integer NOT NULL references colours(colour_id),
);
これにより、お気に入りの色を知ったときに結合を追加できますが、カラーテーブルにエントリを追加するだけで色を追加できるという利点があり、毎回スキーマを変更する必要がないという利点があります。HTMLコードやRVB値などの属性を色に追加することもできます。
列挙型を実行する独自の型を作成することもできますが、varcharや。よりも高速になるとは思いませんCHECK
。
OracleはENUMをまったくサポートしていません。
私の知る限り、IBM DB2もIBM Informix Dynamic ServerもENUM型をサポートしていません。
マットが言ったこととは異なり、PostgreSQLはENUMをサポートしています(バージョン8.3以降、最後のもの):
essais=> CREATE TYPE rcount AS ENUM (
essais(> 'one',
essais(> 'two',
essais(> 'three'
essais(> );
CREATE TYPE
essais=>
essais=> CREATE TABLE dummy (id SERIAL, num rcount);
NOTICE: CREATE TABLE will create implicit sequence "dummy_id_seq" for serial column "dummy.id"
CREATE TABLE
essais=> INSERT INTO dummy (num) VALUES ('one');
INSERT 0 1
essais=> INSERT INTO dummy (num) VALUES ('three');
INSERT 0 1
essais=> INSERT INTO dummy (num) VALUES ('four');
ERROR: invalid input value for enum rcount: "four"
essais=>
essais=> SELECT * FROM dummy WHERE num='three';
id | num
----+-------
2 | three
4 | three
特に列挙型で機能する関数があります。
インデックス付けは列挙型で正常に機能します。
マニュアルによると、実装は次のとおりです。
列挙値はディスク上で4バイトを占めます。列挙値のテキストラベルの長さは、PostgreSQLにコンパイルされたNAMEDATALEN設定によって制限されます。標準ビルドでは、これは最大63バイトを意味します。
列挙型ラベルでは大文字と小文字が区別されるため、「happy」は「HAPPY」と同じではありません。ラベルのスペースも重要です。
MSSQLはENUMをサポートしていません。
Entity Framework 5を使用する場合は、列挙型を使用できます(Entity Frameworkの列挙型サポートおよびEF5列挙型ウォークスルーを参照)が、それでも値はデータベースにintとして格納されます。