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ì?
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:
ROWGUIDCOL
chủ 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:
Xem ở đây , ở đây và phần "Xem xét ảnh chụp" ở đây để biết thêm.
Đánh dấu một cột như ROWGUIDCOL
cho phép nó được tham chiếu qua $ROWGUID
cá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 ROWGUIDCOL
chỉ đị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 UPDATE
Kích hoạt hoặc cấp độ DENY UPDATE
cộ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 $IDENTITY
cho các bảng có một IDENTITY
cột.