標籤:
聯機叢書:
timestamp
timestamp 這種資料類型表現自動產生的位元,確保這些數在資料庫中是唯一的。timestamp 一般用作給表行加版本戳的機制。儲存大小為 8 位元組。
注釋
Transact-SQL timestamp 資料類型與在 SQL-92 標準中定義的 timestamp 資料類型不同。SQL-92 timestamp 資料類型等價於 Transact-SQL datetime 資料類型。
Microsoft® SQL Server™ 將來的版本可能會修改 Transact-SQL timestamp 資料類型的行為,使它與在標準中定義的行為一致。到那時,當前的 timestamp 資料類型將用 rowversion 資料類型替換。
Microsoft® SQL Server™ 2000 引入了 timestamp 資料類型的 rowversion 同義字。在 DDL 語句中儘可能使用 rowversion 而不使用 timestamp。rowversion 受資料類型同義字行為的制約。有關更多資訊,請參見資料類型同義字。
在 CREATE TABLE 或 ALTER TABLE 語句中,不必為 timestamp 資料類型提供列名:
CREATE TABLE ExampleTable (PriKey int PRIMARY KEY, timestamp)
如果沒有提供列名,SQL Server 將產生 timestamp 的列名。rowversion 資料類型同義字不具有這樣的行為。指定 rowversion 時必須提供列名。
一個表只能有一個 timestamp 列。每次插入或更新包含 timestamp 列的行時,timestamp 列中的值均會更新。這一屬性使 timestamp 列不適合作為鍵使用,尤其是不能作為主鍵使用。對行的任何更新都會更改 timestamp 值,從而更改索引值。如果該列屬於主鍵,那麼舊的索引值將無效,進而引用該舊值的外鍵也將不再有效。如果該表在動態資料指標中引用,則所有更新均會更改遊標中行的位置。如果該列屬於索引鍵,則對資料行的所有更新還將導致索引更新。
不可為空白的 timestamp 列在語義上等價於 binary(8) 列。可為空白的 timestamp 列在語義上等價於 varbinary(8) 列。
IF OBJECT_ID(‘test_timestamp‘) IS NOT NULL BEGIN DROP TABLE test_timestamp END GO CREATE TABLE test_timestamp ( id INT PRIMARY KEY IDENTITY(1,1), tname NVARCHAR(20), [rowversion] TIMESTAMP ) GO INSERT INTO test_timestamp (tname) SELECT ‘t1‘ UNION SELECT ‘t2‘ UNION SELECT ‘t3‘ UNION SELECT ‘t4‘ SELECT * FROM test_timestamp tt UPDATE test_timestamp SET tname = ‘t1_update‘ WHERE id=1 --1. 僅僅擷取已更新的行 -- 但之前的最大的那個 rowversion 要另外記錄 SELECT * FROM test_timestamp tt WHERE tt.rowversion>0x00000000000007DC --2. 在兩人同時修改同一條資料時,避免 先取出/後儲存 覆蓋前面的記錄 DECLARE @rowversion TIMESTAMP SELECT @rowversion = rowversion FROM test_timestamp tt WHERE tt.id=1; --過了 5 秒後再修改, 在這 5 秒之內如果有其它update語句修改過此行則此修改無效了. waitfor delay ‘00:00:05‘ update test_timestamp set tname=‘t1_u01‘ where id=1 AND rowversion=@rowversion SELECT * FROM test_timestamp tt WHERE tt.id=1
轉自:http://blog.csdn.net/yenange/article/details/14450691
timestamp 與 rowversion