web-dev-qa-db-ja.com

varchar()列を特定の値に制限しますか?

たとえば、MS SQL Server 2008のvarchar列に4つの異なる値を指定する方法はありますか?

たとえば、可能な値として「Daily」、「Weekly」、「Monthly」、「Yearly」のみを受け入れるFrequency(varchar)という列が必要です。

これは、テーブルを作成するときにSQL Server Management Studio内で設定できますか?

87
Adam

値を制限するcheck constraintをその列に追加することを既に検討しましたか?何かのようなもの:

CREATE TABLE SomeTable
(
   Id int NOT NULL,
   Frequency varchar(200),
   CONSTRAINT chk_Frequency CHECK (Frequency IN ('Daily', 'Weekly', 'Monthly', 'Yearly'))
)
119
Ashish Gupta

チェック制約 が必要です。

CHECK制約は、別の列のデータに基づいていない論理式から有効な値を決定します。たとえば、15,000ドルから100,000ドルの範囲のデータのみを許可するCHECK制約を作成することにより、給与列の値の範囲を制限できます。これにより、通常の給与範囲を超えて給与が入力されるのを防ぎます。

次のようなものが必要です:

ALTER TABLE dbo.Table ADD CONSTRAINT CK_Table_Frequency
    CHECK (Frequency IN ('Daily', 'Weekly', 'Monthly', 'Yearly'))

上記のリンクで説明されているように、スカラー関数を使用してチェック制約を実装することもできます。

47

個人的には、tinyintおよび次のようにコーディングします。

  • いずれか:クライアント上のテキストに変更し、1〜4の制約を確認します。
  • または:外部キーでルックアップテーブルを使用します

理由:

  • テキストを保存するのに平均8バイト、tinyintに1バイトかかります。数百万行を超えると、違いが生じます。

  • 照合はどうですか? 「Daily」は「DAILY」と同じですか?この種の比較を行うにはリソースが必要です。

  • 最後に、「隔週」または「毎時」を追加する場合はどうなりますか?ルックアップテーブルに新しい行を追加するだけの場合は、スキーマを変更する必要があります。

11
gbn

テーブルを編集しているとき
右クリック->制約のチェック->追加->式フィールドにFrequency IN ('Daily', 'Weekly', 'Monthly', 'Yearly')のようなものを入力し、(名前)フィールドに適切な制約名を入力します。
これで完了です。

4
Denis K