ฉันขุดในฐานข้อมูล AdventureWorks2012 และดู Row_GUID ที่ใช้ในหลายตาราง
คำถามของฉันมี 2 ส่วน:
เมื่อใดที่ฉันควรรวมคอลัมน์ Row_GUID
การใช้และประโยชน์ของคอลัมน์ Row_GUID คืออะไร
ฉันขุดในฐานข้อมูล AdventureWorks2012 และดู Row_GUID ที่ใช้ในหลายตาราง
คำถามของฉันมี 2 ส่วน:
เมื่อใดที่ฉันควรรวมคอลัมน์ Row_GUID
การใช้และประโยชน์ของคอลัมน์ Row_GUID คืออะไร
คำตอบ:
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;
ตอนนี้ถ้าการจำลองแบบหรือแอปพลิเคชันของคุณหรือสิ่งที่คุณให้ความสนใจมันจะสังเกตเห็นว่า:
ดูที่นี่ , ที่นี่และ "ภาพรวมการพิจารณา" ส่วนที่นี่เพื่อดูข้อมูลเพิ่มเติม
ทำเครื่องหมายคอลัมน์ตามที่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
คอลัมน์