Row_GUID 列的用途是什么?

SQL*_*ero 23 sql-server uuid

我一直在 AdventureWorks2012 数据库中挖掘并看到在几个表中使用的 Row_GUID。

我的问题有两个部分:

何时应该包含 Row_GUID 列?

Row_GUID 列的用途和好处是什么?

Aar*_*and 26

ROWGUIDCOL主要用于MERGE replication,也需要用于FILESTREAM,但可以用于任何您希望将不可变列与主键分开的情况(例如,在主键值可以更改的情况下,但您仍然希望成为能够分辨出哪一行是更改前后的哪一行)。

USE tempdb;
GO

CREATE TABLE dbo.example
(
  name sysname PRIMARY KEY, 
  rowguid uniqueidentifier NOT NULL DEFAULT NEWID() ROWGUIDCOL
);

INSERT dbo.example(name) VALUES(N'bob'),(N'frank');

SELECT * FROM dbo.example;

UPDATE dbo.example SET name = N'pat' WHERE name = N'bob';
UPDATE dbo.example SET name = N'bob' WHERE name = N'frank';

SELECT * FROM dbo.example;

DROP TABLE dbo.example;
Run Code Online (Sandbox Code Playgroud)

现在,如果复制,或您的应用程序,或您正在关注什么,它会注意到:

在此处输入图片说明

这里这里和“快照事项”一节在这里获得更多信息。

  • @YevgrafAndreyevichZhivago 两行怎么会有相同的主键值?你的意思是*候选*(但也*未明确定义*)键? (2认同)

Sol*_*zky 19

将列标记为ROWGUIDCOL允许$ROWGUID在查询中引用它。这允许使查询更通用,因为您不需要在每个表中查找“唯一”列是什么(这对于 @Aaron 和 @Martin 分别指出的诸如 Replication 和 FileStream 之类的功能非常有用)。您可以在应用层构建查询,甚至在动态 SQL 中构建查询,执行类似操作SELECT $ROWGUID AS [ID] FROM {table_name}并简单地遍历表列表。

只要记住该ROWGUIDCOL名称并没有强制唯一性。您仍然需要通过主键、唯一索引或唯一约束来强制执行。此选项也不强制该列是不可变的。为此,您需要对该AFTER UPDATE列的触发器或列级权限DENY UPDATE

例如:

SET NOCOUNT ON;
CREATE TABLE #RowGuidColTest
(
  ID UNIQUEIDENTIFIER NOT NULL DEFAULT (NEWID()) ROWGUIDCOL,
  SomeValue INT
);

INSERT INTO #RowGuidColTest (SomeValue) VALUES (12), (14), (1231);

DECLARE @Search UNIQUEIDENTIFIER;

SELECT TOP (1) @Search = $ROWGUID
FROM   #RowGuidColTest;

SELECT @Search AS [@Search]

SELECT *, $ROWGUID AS [$ROWGUID]
FROM   #RowGuidColTest;

SELECT *
FROM   #RowGuidColTest
WHERE  $ROWGUID = @Search;

-- No enforced uniqueness without a PK, Unique Index, or Unique Constraint.
UPDATE tmp
SET    $ROWGUID = @Search
FROM   #RowGuidColTest tmp

SELECT *
FROM   #RowGuidColTest
WHERE  $ROWGUID = @Search;
Run Code Online (Sandbox Code Playgroud)

返回类似于:

SET NOCOUNT ON;
CREATE TABLE #RowGuidColTest
(
  ID UNIQUEIDENTIFIER NOT NULL DEFAULT (NEWID()) ROWGUIDCOL,
  SomeValue INT
);

INSERT INTO #RowGuidColTest (SomeValue) VALUES (12), (14), (1231);

DECLARE @Search UNIQUEIDENTIFIER;

SELECT TOP (1) @Search = $ROWGUID
FROM   #RowGuidColTest;

SELECT @Search AS [@Search]

SELECT *, $ROWGUID AS [$ROWGUID]
FROM   #RowGuidColTest;

SELECT *
FROM   #RowGuidColTest
WHERE  $ROWGUID = @Search;

-- No enforced uniqueness without a PK, Unique Index, or Unique Constraint.
UPDATE tmp
SET    $ROWGUID = @Search
FROM   #RowGuidColTest tmp

SELECT *
FROM   #RowGuidColTest
WHERE  $ROWGUID = @Search;
Run Code Online (Sandbox Code Playgroud)

同样,可以$IDENTITY用于具有一IDENTITY列的表。