2017-02-14 31 views
2

私はこれを短くて甘いものにします。私は既存のテーブルにタイプrowversionの列を追加しようとしています。私の考えでは、それをNULLとして追加すると、既存の行にはタイムスタンプが付きませんでした。これが振る舞いであれば、どのような状況で列に空値が認められますか?テーブルにnull可能なrowversion列を追加する

+0

'rowversion'は単なるシステム内部のバイナリカウンタです。既存の行に対してその列の値を持つのはどうですか? –

+0

私のテストでは、CREATE TABLE構文との互換性を除けば、これを許すことは全く無意味だと思われます。おそらくsybaseの遺産の遺産です。 http://sqlfiddle.com/#!6/6ea10 – Davos

答えて

0

あなたがNULLとして設定している場合でも、rowversion値を取る:

CREATE TABLE MyTest (myKey int PRIMARY KEY, myValue int); 
GO 
INSERT INTO MyTest (myKey, myValue) VALUES (1, 0); 
GO 
INSERT INTO MyTest (myKey, myValue) VALUES (2, 0); 
GO 
SELECT * FROM MyTest; 
GO 
ALTER TABLE MyTest ADD rv rowversion NULL; 
GO 
SELECT * FROM MyTest; 
GO 
DROP TABLE MyTest; 

+-------+---------+------------+ 
| myKey | myValue | rv   | 
+-------+---------+------------+ 
| 1  | 0  | 0000020331 | 
+-------+---------+------------+ 
| 2  | 0  | 0000020332 | 
+-------+---------+------------+ 

ここでそれを確認してください:http://rextester.com/ENELE48783

+0

はい。私は質問の声明で多くを言った。私の質問です:彼らはそれがnullable型にするオプションを与える場合、nullableとnullableの間の機能的な違いは何ですか? –

1

を、彼らはあなたにそれNULL可能タイプ作るのオプションを与える場合は、何ですかnullableとnullの間の機能的な違いはありません。

実際には機能的な違いはありません(ただし、 下記参照)。 rowversion列にNULLを挿入することはできません。

INSERTステートメントのrowversion列にNULLを指定しても、サーバーは生成されたNULL以外の値を挿入します。 rowversion列(NULLまたはNOT NULL)を宣言した方法に関係なく、このように機能します。


回だけdocs言及のNULL可能rowversion

nonnullable rowversion列が binary(8)列と意味的に等価です。 null可能なrowversion列は、意味的に列に相当する です。

あなたはそれが(実際には起こり得ない)可能性NULL値の記憶を可能にするために、ディスク上の多くのスペースを占有する必要がありrowversion NULL可能を指定した場合。各NULL可能列は、オーバーヘッドが発生し、参照:How much size "Null" value takes in SQL Server

がNULL可能列を有するためのオーバーヘッドもあるヌル値を格納するのに必要なスペースに加えて。

さらに、varbinary(8)は、値の長さを格納するために、binary(8)よりもディスク上のスペースが必要です。


これまで述べてきたように、それぞれ10M行の2つのテーブルを作成しようとしました。 1つはNULL可能なrowversion列、2番目はnull不可能なrowversion列です。私のテストでは、両方のテーブルがまったく同じ量のディスクスペースを占めていました。私はSQL Server 2014 Expressをテストしました。

+0

私はこれを恐れていました。私がしようとしていたのは、SQL Serverの動作を使用して、その列を追加するためのメタデータ操作としてNULL可能な列を追加することでした。代わりに、それは列のNULL可能性に関係なく、それは "データのサイズ"操作のままです。バマー。見てくれてありがとう! –

+0

"' varbinary(8) 'は' varbinary(8) 'を持っていて、1バイトのバイナリ値しか挿入しないと、それはどれくらいの大きさですか?ドキュメントによると、値の長さ+ 2バイトなので、3バイトになります。 'binary(8)'は常に8バイトです。あなたが引用したもう一つの質問は、 "フィールドが可変幅の場合、NULL値はスペースを必要としません"とし、 "カラムをヌル可能にするためにストレージスペースに何か費用がかかることは本当ですが、値を格納するのに必要なスペース(可変幅の列の場合)よりもNULLを格納するスペース。 – Davos

+0

NULLを挿入できない場合、NULLABLE ROWVERSIONを指定すると、8バイトより小さいrowversion値が挿入されたときに空き領域が少なくなる可能性があります。そうでない場合は、無意味なように見えます。あなたは常にヌル可能ではないものを使うべきですが、私は確信していません。テストでディスクサイズをどのように比較しましたか?たぶん、ページサイズは同じですが、ページがいっぱいになったり、似たようなものがあります。 – Davos

関連する問題