MSSQLデータベースを使用していて、4つの可能な値しかない列を作成したいと思います。2ビット列を定義する方法はありますか?ビットデータ型が表示されたら、次に小さいのはtinyintで、これは1フルバイトです。
そのような分野がないのなら、なぜそうしないのかを知りたいと思います。
ありがとう。
MSSQLデータベースを使用していて、4つの可能な値しかない列を作成したいと思います。2ビット列を定義する方法はありますか?ビットデータ型が表示されたら、次に小さいのはtinyintで、これは1フルバイトです。
そのような分野がないのなら、なぜそうしないのかを知りたいと思います。
ありがとう。
フィールドサイズについてどのような懸念がありますか?フィールドドメインを実装する方法は、外部キー制約を使用する必要があります(MSSQLにはそれが必要です)。
そのような分野の理由はわかりません。
それは間違いなくスペースになることはできません-それは今日は安いです、そしてあなたがたくさんの行を持っていない限り、6ビットの経済は本当に無視できます。しかし、その場合、とにかく多くのスペースを占有し、行ごとに6ビットを追加してもほとんど違いはありません。
速度も正当な理由ではありません。このようなビットフィールドでは、格納および取得するために追加の操作が必要になり、単にバイト全体を処理するよりもプロセス全体が大幅に遅くなります。
最後に、制約に関する場合は、外部キーまたはユーザー定義型を使用する必要があります(ただし、.NETでの追加のコーディングが必要になります)。単純にバイトを使用して、アプリケーションに制約を実装しますが。おそらくそれほど良くはありませんが、はるかに簡単です。
更新:はい。ただし、MSSQLでは「列挙型」制約が役立ちます。しかし、これも単なる2ビットフィールドとは少し異なります。
つまり、4つの値を含む別のテーブルへの外部キーが必要だということですか?
深刻な心配はありません。2ビットしか必要としないものにフルバイトを与える意味がわかりません。可変ビット長フィールドが存在しない理由についてもっと知りたいです。
私はこれについてフリオルを持っています。
4つの可能な値を含むルックアップテーブルを作成し、外部キーを介してそれらにリンクします。
データ型に関しては、smallintは取得するのと同じくらい小さいので、SQL Serverは実際にはデータの個々のビットを保持して操作するようには設計されていませんが、バイナリ列のビット演算子を使用して実行できますが、最小の場合でも可能です。それらのうち、ディスク上でははるかに大きいです。SQL Serverのビット列も3つの潜在的な値(1、0、およびnull)があるため、異常です。
他の諸君の言うことを 作り直すことなく それでもやりたいなら 直接の方法はない... でもビット列を 2 つ使えば
次に、2 ビット列の値に対応する値 (0 ~ 3) を生成する計算列を追加します。
CREATE TABLE [dbo].[testTable](
[colA] [bit] NOT NULL,
[colB] [bit] NOT NULL,
[CalcCol] AS (case [colA] when (1) then (2) else (0) end+[colB])
) ON [PRIMARY]
別の 4 つの値のセットが必要な場合は、0 ~ 3 を計算式に入れるだけです。
CREATE TABLE [dbo].[testTable](
[colA] [bit] NOT NULL,
[colB] [bit] NOT NULL,
[CalcCol] As
(Case ColA
When 0 Then Case ColB WHen 0 Then ValueA Else ValueB End
Else Case ColB WHen 0 Then ValueC Else ValueD End
End)
) ON [PRIMARY]
唯一の問題は、計算された列が直接「書き込み可能」ではないことです-個別のコードで個々のビットフィールドに書き込む必要があります...のように
Update TestTable Set
colA = Case When Value In (ValueA, ValueB) Then 0 Else 1 End,
colB = Case When Value In (ValueA, ValueC) Then 0 Else 1 End
Where ...
データベースがフロッピー ディスクに格納されていない限り、私は気にしません。ここで残りのアドバイスを受けて、残りのデータベースの構築に進みます。