我會保持這個簡短而甜美。我正在嘗試將rowversion
類型的列添加到現有表中。我的想法是,通過將其添加爲NULL
,現有的行不會加蓋時間戳,但是它們是。如果那是行爲,在什麼情況下列會承認一個空值?在表中添加一個可爲空的rowversion列
回答
即使你把它設置爲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 |
+-------+---------+------------+
是的。我在這個問題的陳述中同樣表達了很多。我的問題是:如果他們給了你一個可以爲空的選項,可空與不可空的功能區別是什麼? –
,如果他們給你使它可空類型的選擇是什麼可空與不可空的功能差異
實際上沒有功能差異(但可能存在差異, 見下文)。您不能將NULL
插入到rowversion
列中。
即使您爲INSERT
語句中的rowversion
列指定了NULL
,服務器也會插入生成的非空值。無論您如何聲明rowversion
列(NULL
或NOT 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上進行了測試。
我很害怕這個。我試圖做的是使用SQL Server的行爲來添加一個可爲空的列作爲元數據操作來添加該列。相反,它看起來不管列的可空性如何,它仍然是「數據大小」操作。遊民。感謝您的期待! –
「'varbinary(8)'在磁盤上佔用的空間多於'binary(8)'」如果你有一個'varbinary(8)',但只插入一個1字節的二進制值,它有多大?根據文檔,它是值+ 2字節的長度,所以它將是3個字節。 「二進制(8)」總是8個字節。你引用的另一個問題還說「如果字段是可變寬度,NULL值不佔用空間」,然後「這是真的,它在存儲空間中花費一些東西來使列可以爲空,但是一旦你完成了,空間來存儲一個NULL,而不是存儲一個值(對於可變寬度的列)。「 – Davos
如果您無法插入NULL,那麼指定NULLABLE ROWVERSION的潛在好處可能是,當插入的rowversion值小於8個字節時,它們佔用的空間更少。如果情況並非如此,那麼它似乎毫無意義,你應該總是使用不可空,但我不相信。你如何比較測試中的磁盤大小?也許有頁面大小相同,但頁面填充不足,或類似的東西。 – Davos
- 1. 添加一個可爲空的外鍵。
- 2. 如何爲2個可爲空的列添加唯一約束?
- 3. 在列表中添加一個列表
- 4. 在列表中添加一個列表
- 5. 如何在已有rowversion列的表中存儲rowversion值?
- 6. 我可以在列表中添加一個列表嗎?
- 7. 添加一個空白列
- 8. 我們可以在From子句中添加一個空表
- 9. 在java中添加一個列表到另一個列表?
- 10. 在另一個列表中添加一個列表
- 11. Python:如何在派生類中添加一個空列表
- 12. 在Kotlin中包含可爲空的列表的可爲空值的列表
- 13. 在列表中添加一個清單
- 14. 在列表中添加一個新值
- 15. 在列表中添加一個字典
- 16. 在詞典中添加一個列表
- 17. 添加一個元素到Haskell空列表和檢索列表
- 18. 將一個列表添加到一個單獨的列表中
- 19. 需要在Spotfire表中添加空列
- 20. 當我將元組列表添加到另一個列表時,它變爲空
- 21. 如何將一個空列表添加到一個元組
- 22. Asp.net WebApi添加一個項目在嵌套的子列表中時,列表中設置爲空json
- 23. 列表爲空時添加按鈕
- 24. MVC POCO列表爲空:添加新項
- 25. 在TensorFlow中製作一個列表並添加到列表中
- 26. 如果值爲空,則添加一列
- 27. 我可以爲每行在displaytag表中添加一個ID嗎?
- 28. 如何將一個空選項添加到下拉列表中
- 29. 我無法將一個節點添加到空列表中
- 30. 在Excel圖表上添加一個空系列
'rowversion'只是一個系統內部的二進制計數器 - 在現有行的列中存在值的危害是什麼? –
從我的測試來看,除了與CREATE TABLE語法的兼容性之外,允許這樣做似乎毫無意義,它可能是sybase遺留的遺留問題。 http://sqlfiddle.com/#!6/6ea10 – Davos