真的不建议使用“时间戳记”吗?

时间:2019-03-31 17:04:24

标签: sql-server

Microsoft建议我们使用rowversion而不是timestamphttps://docs.microsoft.com/en-us/sql/t-sql/data-types/rowversion-transact-sql?view=sql-server-2017

但是,我看不到该怎么做。

参考的T-SQL文档说:

  

如果未指定列名,则SQL Server数据库引擎将生成时间戳列名;但是,rowversion同义词不遵循此行为。使用rowversion时,必须指定列名,例如:

CREATE TABLE ExampleTable2 (PriKey int PRIMARY KEY, VerCol rowversion) ;

但是,当我使用此代码生成表时,SSMS中的列显示为:

  Colum Name: VerCol

  Data type: timestamp

是否可以在SQL Server中使用rowversion

1 个答案:

答案 0 :(得分:1)

不建议使用timestamp 语法,即按列的类型指定列而不指定其名称。在下面,它仍然是timestamp,键入id = 189;尝试select * from sys.types where system_type_id = 189rowversion关键字仅用于区分两者。这些是等效的:

CREATE TABLE a (id INT PRIMARY KEY IDENTITY(1, 1), VerCol timestamp)
CREATE TABLE b (id INT PRIMARY KEY IDENTITY(1, 1), VerCol rowversion)

这两个表的外观和行为完全相同。尝试

SELECT * FROM sys.columns WHERE object_id in (OBJECT_ID('dbo.a'), OBJECT_ID('dbo.b'))

您将看到两个VerCol列都具有相同的system_type_id。如果您尝试:

INSERT INTO a DEFAULT VALUES
INSERT INTO b DEFAULT VALUES

SELECT * FROM a
SELECT * FROM b

您会得到类似的东西:

id          VerCol
----------- ------------------
1           0x00000000000007D3

(1 row affected)

id          VerCol
----------- ------------------
1           0x00000000000007D4

(1 row affected)

对于您的数据库,VerCol值当然会有所不同。