Mục đích của cột Row_GUID là gì?


18

Tôi đã đào sâu trong cơ sở dữ liệu AdventureWorks2012 và thấy Row_GUID được sử dụng trong một số bảng.

Có 2 phần cho câu hỏi của tôi:

Khi nào tôi nên bao gồm một cột Row_GUID?

Công dụng và lợi ích của cột Row_GUID là gì?

Câu trả lời:


25

ROWGUIDCOLchủ yếu được sử dụng để sao chép MERGE và cũng được yêu cầuFILESTREAM , nhưng có thể được sử dụng trong mọi trường hợp mà bạn muốn một cột bất biến tách biệt với khóa chính (ví dụ trong trường hợp giá trị khóa chính có thể thay đổi, nhưng bạn vẫn muốn có thể cho biết hàng nào trước và sau khi thay đổi).

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;

Bây giờ, nếu sao chép, hoặc ứng dụng của bạn, hoặc những gì bạn đang chú ý, nó sẽ nhận thấy rằng:

nhập mô tả hình ảnh ở đây

Xem ở đây , ở đây và phần "Xem xét ảnh chụp" ở đây để biết thêm.


Thêm ROWGUIDCOLUMN vào các bảng được sao chép, đảm bảo rằng công cụ sao chép có thể sử dụng trường ROWGUIDCOLUMN để phân biệt giữa các bản ghi có cùng giá trị khóa chính. - Rich Turner - stackoverflow.com/questions/4443036/ từ
Yevgraf Andreyevich Zhivago

1
@YevgrafAndreyevichZhivago Làm thế nào hai hàng có thể có cùng giá trị khóa chính? Ý của bạn là khóa ứng viên (nhưng cũng không được xác định rõ ràng )?
Aaron Bertrand

13

Đánh dấu một cột như ROWGUIDCOLcho phép nó được tham chiếu qua $ROWGUIDcác truy vấn. Điều này cho phép làm cho các truy vấn chung chung hơn vì bạn không cần phải tìm kiếm, trên mỗi bảng, cột "duy nhất" là gì (điều này khá hữu ích cho các tính năng như Sao chép và FileStream như được ghi chú bởi @Aaron và @Martin, tương ứng ). Bạn có thể có một truy vấn được xây dựng trong lớp ứng dụng hoặc trong SQL động, thậm chí thực hiện một cái gì đó giống như SELECT $ROWGUID AS [ID] FROM {table_name}và chỉ đơn giản lặp lại qua một danh sách các bảng.

Chỉ cần nhớ rằng ROWGUIDCOLchỉ định không thực thi tính duy nhất. Bạn vẫn sẽ cần phải thực thi điều đó thông qua Khóa chính, Chỉ mục duy nhất hoặc Ràng buộc duy nhất. Tùy chọn này cũng không thực thi rằng cột là bất biến. Vì vậy, bạn sẽ cần một quyền AFTER UPDATEKích hoạt hoặc cấp độ DENY UPDATEcột trên cột đó.

Ví dụ:

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;

Trả về một cái gì đó tương tự như:

@Search
E7166D18-5003-4D20-8983-E2402472CF82


ID                                      SomeValue    $ROWGUID
E7166D18-5003-4D20-8983-E2402472CF82    12           E7166D18-5003-4D20-8983-E2402472CF82
44FD48A4-AF38-41BF-AE4E-8A12D26B5B57    14           44FD48A4-AF38-41BF-AE4E-8A12D26B5B57
2D50C5C7-1E43-4ADA-A03B-ED202FC88D20    1231         2D50C5C7-1E43-4ADA-A03B-ED202FC88D20


ID                                      SomeValue
E7166D18-5003-4D20-8983-E2402472CF82    12


ID                                      SomeValue
E7166D18-5003-4D20-8983-E2402472CF82    12
E7166D18-5003-4D20-8983-E2402472CF82    14
E7166D18-5003-4D20-8983-E2402472CF82    1231

Tương tự, người ta có thể sử dụng $IDENTITYcho các bảng có một IDENTITYcột.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.