पंक्ति_GUID कॉलम का उद्देश्य क्या है?


18

मैं AdventureWorks2012 डेटाबेस में चारों ओर खुदाई कर रहा हूं और कई तालिकाओं में रो_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 फ़ील्ड को समान प्राथमिक कुंजी मानों के साथ रिकॉर्ड के बीच अंतर करने के लिए उपयोग कर सकता है। - रिच टर्नर - stackoverflow.com/questions/4443036/…
येवग्रे आंद्रेयेविच झिवागो

2
@YevgrafAndreyevichZhivago कैसे दो पंक्तियों में एक ही प्राथमिक कुंजी मान हो सकता है? क्या आपका मतलब उम्मीदवार (लेकिन यह भी स्पष्ट रूप से परिभाषित नहीं ) कुंजी है?
हारून बर्ट्रेंड

13

एक कॉलम को चिह्नित करने के रूप में ROWGUIDCOLइसे $ROWGUIDप्रश्नों में संदर्भित किया जा सकता है । इससे प्रश्नों को अधिक सामान्य बनाने की अनुमति मिलती है, क्योंकि आपको प्रत्येक तालिका को देखने की आवश्यकता नहीं होगी, "अद्वितीय" कॉलम क्या है (यह प्रतिकृति और फ़ाइलस्ट्रीम जैसी सुविधाओं के लिए काफी उपयोगी है, जैसा कि @Aaron और @Martin द्वारा क्रमशः उल्लेख किया गया है। )। आपके पास ऐप लेयर में या डायनेमिक 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;

कुछ इसी तरह लौटाता है:

@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कॉलम है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.