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


94

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

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

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


5
有効な値がなくなり、テーブルに多くの行が含まれると想定しても安全な場合は、varchar()よりも小さくて速いものに可能な値をエンコードします。
Wikser

回答:


127

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

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

2
ありがとう-これはうまくいきました。私がしなければならなかった小さな変更の1つは、「周波数IN ....」も括弧で囲む必要があったことです。SQLサーバースタジオは、何らかの理由でそれなしではそれを好みませんでした。
Adam

1
この制約チェックでは大文字と小文字が区別されますか?
RWendi 2013年

3
4行目以降にコマを逃したと思いますFrequency varchar(200)
BillOverFlow 2016

RWendi-デフォルトのSQL Server照合は大文字と小文字を区別しません。これはデータベースレベルで適用されます。ここでのさらなる情報stackoverflow.com/questions/1439485/...
jwoe

57

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

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

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

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

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


1
この答えも良かったです。:)
Adam

1
うん

11

個人的には、tinyintとしてコード化し、

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

理由:

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

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

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


5

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.