จุดประสงค์ของคอลัมน์ Row_GUID คืออะไร


18

ฉันขุดในฐานข้อมูล AdventureWorks2012 และดู Row_GUID ที่ใช้ในหลายตาราง

คำถามของฉันมี 2 ส่วน:

เมื่อใดที่ฉันควรรวมคอลัมน์ Row_GUID

การใช้และประโยชน์ของคอลัมน์ Row_GUID คืออะไร

คำตอบ:


25

ROWGUIDCOLใช้สำหรับการจำลองแบบ MERGEเป็นหลักและยังจำเป็นสำหรับ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;

ตอนนี้ถ้าการจำลองแบบหรือแอปพลิเคชันของคุณหรือสิ่งที่คุณให้ความสนใจมันจะสังเกตเห็นว่า:

ป้อนคำอธิบายรูปภาพที่นี่

ดูที่นี่ , ที่นี่และ "ภาพรวมการพิจารณา" ส่วนที่นี่เพื่อดูข้อมูลเพิ่มเติม


การเพิ่ม ROWGUIDCOLUMN ไปยังตารางที่กำลังทำซ้ำช่วยให้มั่นใจว่ากลไกการจำลองแบบสามารถใช้ฟิลด์ ROWGUIDCOLUMN เพื่อแยกความแตกต่างระหว่างระเบียนด้วยค่าคีย์หลักเดียวกัน - Rich Turner - stackoverflow.com/questions/4443036/…
Yevgraf Andreyevich Zhivago

2
@YevgrafAndreyevichZhivago สองแถวจะมีค่าคีย์หลักเหมือนกันได้อย่างไร คุณหมายถึงผู้สมัคร ( แต่ยังไม่ได้กำหนดไว้อย่างชัดเจน ) คีย์?
Aaron Bertrand

13

ทำเครื่องหมายคอลัมน์ตามที่ROWGUIDCOLอนุญาตให้อ้างอิงผ่าน$ROWGUIDในคิวรี สิ่งนี้ช่วยให้สามารถสร้างคิวรีทั่วไปได้มากขึ้นเนื่องจากคุณไม่จำเป็นต้องค้นหาแต่ละคอลัมน์ว่าคอลัมน์ "ที่ไม่ซ้ำกัน" คืออะไร (ซึ่งค่อนข้างมีประโยชน์สำหรับฟีเจอร์เช่น Replication และ FileStream ตามที่ระบุไว้โดย @Aaron และ @Martin ตามลำดับ ) คุณสามารถสร้างแบบสอบถามในเลเยอร์แอปหรือใน Dynamic SQL แม้กระทั่งทำสิ่งที่ต้องการSELECT $ROWGUID AS [ID] FROM {table_name}และทำซ้ำในรายการของตาราง

เพียงจำไว้ว่าการROWGUIDCOLแต่งตั้งไม่ได้บังคับใช้ความเป็นเอกลักษณ์ คุณจะต้องบังคับใช้คีย์หลัก, ดัชนีเฉพาะหรือข้อ จำกัด เฉพาะ ตัวเลือกนี้ไม่บังคับใช้ว่าคอลัมน์นั้นไม่เปลี่ยนรูป เพื่อที่คุณจะต้องAFTER UPDATEได้รับอนุญาตระดับ Trigger หรือคอลัมน์ไปที่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;

ส่งคืนสิ่งที่คล้ายกับ:

@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

ในทำนองเดียวกันหนึ่งสามารถใช้$IDENTITYสำหรับตารางที่มีIDENTITYคอลัมน์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.