MySQL enumデータ型に相当するSQL Serverですか?


回答:


155

そうではありません。あいまいな同等物があります:

mycol VARCHAR(10) NOT NULL CHECK (mycol IN('Useful', 'Useless', 'Unknown'))

10
有効な値を定義するテーブルを使用してから、代わりに外部キー制約を使用しないのはなぜですか?
Elaskanator 2018

@Elaskanatorこれは直接OPに最も正確に答えると思いますが、そのための最善の解決策はおそらくFK +外部テーブルの使用です。
userfuser 2018

@Elaskanatorに明らかなことを思い出させてくれてありがとう...データを正規化し、列挙型の存在を停止します。
アンドリュー、

88

これで私が見つけた最良の解決策は、可能な値を主キーとして持つルックアップテーブルを作成し、ルックアップテーブルへの外部キーを作成することです。


13
保守性の観点からは、上記のチェック制約よりも優れたソリューションです。
HLGEM 2012年

21
これはEnumsよりも優れたソリューションです-MySQLでも同様です。
ypercubeᵀᴹ

2
@ypercubeなぜMySQLにも良いのですか?
BenR 2014年

4
@BenRecord MySQLの列挙型にはいくつかの問題があります。MySQLのENUMデータ型が悪である8つの理由。それが悪だと100%同意することはできませんが、それらを使用するときは特に注意する必要があります。
ypercubeᵀᴹ

1
@BenRまた、MySQLの非ストリクトモードで正しくリコールすると、無効な列挙がNULLとして挿入される可能性があります。条件が何であれ、以前の私のチームは、値のリストで値が指定されていない場合、MySQL enumが挿入されず、失敗しないという問題がありました。ルックアップテーブルの外部キー制約は失敗の原因となります。MySQLにはルックアップテーブルの方が適していることに同意します。
ジムシューベルト


2
CREATE FUNCTION ActionState_Preassigned()
RETURNS tinyint
AS
BEGIN
    RETURN 0
END

GO

CREATE FUNCTION ActionState_Unassigned()
RETURNS tinyint
AS
BEGIN
    RETURN 1
END

-- etc...

パフォーマンスが重要な場合は、ハード値を使用します。


1

SQL Serverに列挙型を実装したいときに、この興味深いアプローチを見つけました。

以下のリンクで説明されているアプローチは、データベース列挙型のすべてのニーズを2つの中央テーブルで満たすことができることを考えると、非常に説得力があります。

http://blog.sqlauthority.com/2010/03/22/sql-server-enumerations-in-relational-database-best-practice/


8
これは、「1つの真の(ルックアップ)テーブル」として知られるアンチパターンのバリエーションです。適切なアプローチは、列挙型ごとに個別のテーブルを用意し、外部キーを使用することです(まったく検索が必要な場合は、「純粋な」列挙の場合とは異なります)。
ブランコディミトリエビッチ2014

2
リンクされたページのコメントは、この回答が指定するものではなく、「列挙型」ごとに個別のテーブルを使用するための適切なバックアップを提供します
skia.heliou

4
ほとんどの人がこのデザインを正当に非難する方法はかなりおかしいですが、著者は彼の記事を「ベストプラクティス」と名付けています。
underscore_d
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.