2017-02-14 15 views
2

我會保持這個簡短而甜美。我正在嘗試將rowversion類型的列添加到現有表中。我的想法是,通過將其添加爲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

是的。我在這個問題的陳述中同樣表達了很多。我的問題是:如果他們給了你一個可以爲空的選項,可空與不可空的功能區別是什麼? –

1

,如果他們給你使它可空類型的選擇是什麼可空與不可空的功能差異

實際上沒有功能差異(但可能存在差異, 見下文)。您不能將NULL插入到rowversion列中。

即使您爲INSERT語句中的rowversion列指定了NULL,服務器也會插入生成的非空值。無論您如何聲明rowversion列(NULLNOT NULL),它都會像這樣工作。


docs提及可空rowversion只有一次:

甲非空rowversion列在語義上等同於一個 binary(8)柱。可空的rowversion列在語義上爲 等同於varbinary(8)列。

如果指定rowversion可爲空應該佔用的磁盤空間更大,以使可能的NULL值(這在實踐中是不可能發生的)的存儲空間。每個空列招致額外的開銷,見:How much size "Null" value takes in SQL Server

除了存儲空值所需要的空間也有 用於具有空的列的開銷。

此外,varbinary(8)需要更多的磁盤空間比binary(8)存儲值的長度。


說了這麼多之後,我試着用10M行創建兩個表。一個爲可空rowversion列,其次爲不可空rowversion列。在我的測試中,兩個表佔用的磁盤空間量完全相同。我在SQL Server 2014 Express上進行了測試。

+0

我很害怕這個。我試圖做的是使用SQL Server的行爲來添加一個可爲空的列作爲元數據操作來添加該列。相反,它看起來不管列的可空性如何,它仍然是「數據大小」操作。遊民。感謝您的期待! –

+0

「'varbinary(8)'在磁盤上佔用的空間多於'binary(8)'」如果你有一個'varbinary(8)',但只插入一個1字節的二進制值,它有多大?根據文檔,它是值+ 2字節的長度,所以它將是3個字節。 「二進制(8)」總是8個字節。你引用的另一個問題還說「如果字段是可變寬度,NULL值不佔用空間」,然後「這是真的,它在存儲空間中花費一些東西來使列可以爲空,但是一旦你完成了,空間來存儲一個NULL,而不是存儲一個值(對於可變寬度的列)。「 – Davos

+0

如果您無法插入NULL,那麼指定NULLABLE ROWVERSION的潛在好處可能是,當插入的rowversion值小於8個字節時,它們佔用的空間更少。如果情況並非如此,那麼它似乎毫無意義,你應該總是使用不可空,但我不相信。你如何比較測試中的磁盤大小?也許有頁面大小相同,但頁面填充不足,或類似的東西。 – Davos

相關問題