2009-07-26 19 views
38

nvarchar(max)列に制約を作成できないのはなぜですか? SQL Serverでは、独自の制約を設定することはできません。しかし、nvarchar(100)列に一意の制約を作成することができます。なぜnvarchar(max)に制約を設定できないのですか?

これらの列はいずれもNOT NULLです。 nvarchar(max)列に制約を追加できない理由はありますか?

答えて

23

MAXは実際には大きいので(2 -1バイト)、サーバーがマルチメガバイトサイズのエントリで一意性をチェックする必要がある場合、サーバーの破損につながる可能性があります。

Create Indexのドキュメントから、固有の制約についても同様です。

の合計インデックス値の最大許容サイズは900バイトです。

EDIT:あなたが本当に一意性を必要に応じて、あなたは、潜在的にデータのハッシュを計算し、一意のインデックスにそれを格納することで、それを近似することができます。たとえ大きなハッシュであっても、インデックス可能な列に収まるほど小さくなることがあります。衝突を処理する方法を理解する必要があります。誤った衝突が見つかった場合は、手動で衝突をチェックし、データを埋め込む(ハッシュを変更する)かもしれません。

+0

そのために、インデックスが設定できる最大値がありますか、それとも単に「MAX」ではないのですか? –

+0

MAXを使用していない限り、 'nvarchar'と' varchar'の最大長は8000レンジのどこかにあると思います。 – Thorarin

+1

インデックスのすべてのキー列の最大合計サイズは900バイトです。 http://msdn.microsoft.com/en-us/library/ms191241.aspx –

4

一意の制約は実際にはインデックスであり、インデックスではnvarchar(max)をキーとして使用できません。

72

nvarchar(max)は実際にはnvarchar(integer-length)とは異なるデータ型です。その特性は非推奨のtextデータ型によく似ています。

nvarchar(max)

textように、大きくなりすぎた場合は、外列に格納される(行が8000バイトの最大値に制限され)、それへのポインタは、行自体に格納されています。そのような大きなフィールドを効率的に索引付けすることはできず、データを他の場所に保管できるという事実により、索引の検索とスキャンがさらに複雑になります。
ユニークな制約では、インデックスを強制する必要があり、その結果、SQL Serverのデザイナーは、独自の制約を作成することを禁止しました。

+5

もちろん、彼らは過度に高い確率でチェックするために制約を安くするために、CRCまたはMD5のバージョンを使用することができました。いかなる場合でも;彼らはしなかった... –

+0

説明のおかげで、あなたはこれ以上私ができることを説明するのを手伝った! –

関連する問題