यह आलेख दर्शाता है कि Transact-SQL का उपयोग करके SQL सर्वर में किसी मौजूदा तालिका में प्राथमिक कुंजी कैसे जोड़ें।
प्राथमिक कुंजी एक स्तंभ है जिसे किसी तालिका के लिए विशिष्ट पहचानकर्ता के रूप में कॉन्फ़िगर किया गया है।
जब आप तालिका बनाते हैं तो आप सामान्य रूप से प्राथमिक कुंजी बाधा बनाते हैं, लेकिन आप किसी मौजूदा तालिका में प्राथमिक कुंजी भी जोड़ सकते हैं।
ध्यान दें कि एक तालिका में केवल एक प्राथमिक कुंजी हो सकती है। इसलिए यदि तालिका में पहले से एक है तो आप प्राथमिक कुंजी नहीं जोड़ सकते।
साथ ही प्राथमिक कुंजियों को केवल उन स्तंभों में जोड़ा जा सकता है जिन्हें NOT NULL
. के रूप में परिभाषित किया गया है .
उदाहरण 1 - एक प्राथमिक कुंजी बाधा जोड़ें
इस उदाहरण में मैं एक टेबल बनाता हूं, लेकिन मैं प्राथमिक कुंजी बाधा जोड़ना भूल जाता हूं। इसलिए मैं फिर वापस जाता हूं और प्राथमिक कुंजी रखने के लिए तालिका को बदल देता हूं।
तालिका बनाएं (लेकिन प्राथमिक कुंजी बनाना भूल जाएं ):
USE Test; CREATE TABLE Colors ( ColorId int IDENTITY (1,1) NOT NULL, ColorName varchar(50) );
परिणाम:
Commands completed successfully. Total execution time: 00:00:00.058
ओह - मैं प्राथमिक कुंजी बनाना भूल गया!
कोई बात नहीं! हम अभी एक जोड़ सकते हैं:
ALTER TABLE Colors ADD CONSTRAINT PK_Colors_ColorId PRIMARY KEY CLUSTERED (ColorId);
परिणाम:
Commands completed successfully. Total execution time: 00:00:00.031
इसने अब एक PRIMARY KEY
जोड़ दी है ColorId
. के लिए बाधा कॉलम।
उदाहरण 2 - प्राथमिक कुंजी बाधा की जांच करें
आइए डेटाबेस में प्राथमिक कुंजी बाधाओं की सूची वापस करने के लिए निम्न कोड चलाएं:
SELECT name, type, unique_index_id, is_system_named FROM sys.key_constraints WHERE type = 'PK';
परिणाम:
+------------------------------+--------+-------------------+-------------------+ | name | type | unique_index_id | is_system_named | |------------------------------+--------+-------------------+-------------------| | PK__MyTest__606C418F16F9CCCF | PK | 1 | 1 | | PK__Client__96ADCE1ACB91C2A9 | PK | 1 | 1 | | PK_Colors_ColorId | PK | 1 | 0 | +------------------------------+--------+-------------------+-------------------+
आपके डेटाबेस में प्राथमिक कुंजियों के आधार पर आपके परिणाम भिन्न होंगे।
यह भी ध्यान दें कि यह सिस्टम दृश्य मेरे द्वारा यहां निर्दिष्ट किए गए कॉलम से अधिक देता है, लेकिन आप *
का उपयोग कर सकते हैं यदि आप चाहें तो सभी कॉलम वापस करने के लिए वाइल्डकार्ड।
उदाहरण 3 - किसी स्तंभ में प्राथमिक कुंजी जोड़ना जो NULL मानों की अनुमति देता है
प्राथमिक कुंजी केवल उन स्तंभों में जोड़ी जा सकती है जिन्हें NOT NULL
. के रूप में परिभाषित किया गया है . यदि आप किसी ऐसे कॉलम में प्राथमिक कुंजी जोड़ने का प्रयास करते हैं जो अशक्त है, तो आपको एक त्रुटि मिलेगी।
इसे प्रदर्शित करने के लिए, चलिए एक और टेबल बनाते हैं, लेकिन इस बार, हम कॉलम को NOT NULL
के रूप में निर्दिष्ट करना भी भूल जाएंगे। :
USE Test; CREATE TABLE Colors2 ( ColorId int, ColorName varchar(50) );
कॉलम नल की अनुमति देता है या नहीं, यह जांचने के लिए हम निम्नलिखित क्वेरी चला सकते हैं:
SELECT t.name AS 'Table', c.name AS 'Column', c.is_nullable, c.is_identity FROM sys.columns c INNER JOIN sys.tables T ON c.object_id = t.object_id WHERE c.name = 'ColorId';
परिणाम:
+---------+----------+---------------+---------------+ | Table | Column | is_nullable | is_identity | |---------+----------+---------------+---------------| | Colors | ColorId | 0 | 1 | | Colors2 | ColorId | 1 | 0 | +---------+----------+---------------+---------------+
हम देख सकते हैं कि जिसे हमने पहले बनाया था (Colors
. में) तालिका) अशक्त है और एक पहचान स्तंभ है। दूसरा वाला (Colors2
. में) तालिका) अशक्त है और पहचान स्तंभ नहीं है।
आइए अब एक प्राथमिक कुंजी बाधा को अशक्त कॉलम में जोड़ने का प्रयास करें:
ALTER TABLE Colors2 ADD CONSTRAINT PK_Colors2_ColorId PRIMARY KEY CLUSTERED (ColorId);
परिणाम:
Msg 8111, Level 16, State 1, Line 1 Cannot define PRIMARY KEY constraint on nullable column in table 'Colors2'. Msg 1750, Level 16, State 0, Line 1 Could not create constraint or index. See previous errors.
इसलिए इस मामले में, हमें कॉलम को NOT NULL
. में बदलना होगा इससे पहले कि हम इसे प्राथमिक कुंजी के रूप में परिभाषित करने का प्रयास करें।
हम ALTER COLUMN
. का उपयोग कर सकते हैं एक ALTER TABLE
. के भीतर इस कॉलम को NOT NULL
पर सेट करने के लिए स्टेटमेंट :
ALTER TABLE Colors2 ALTER COLUMN ColorId int NOT NULL;
आइए फिर से कॉलम की जांच करें:
SELECT t.name AS 'Table', c.name AS 'Column', c.is_nullable, c.is_identity FROM sys.columns c INNER JOIN sys.tables T ON c.object_id = t.object_id WHERE c.name = 'ColorId';
परिणाम:
+---------+----------+---------------+---------------+ | Table | Column | is_nullable | is_identity | |---------+----------+---------------+---------------| | Colors | ColorId | 0 | 1 | | Colors2 | ColorId | 0 | 0 | +---------+----------+---------------+---------------+
तो हम देख सकते हैं कि Colors2
अब 0
. पर सेट है , जिसका अर्थ है कि यह अशक्त नहीं है (इसमें NULL मान नहीं हो सकते हैं)।
यह भी ध्यान रखें कि कॉलम नहीं है एक पहचान स्तंभ। मैं इस पर बाद में चर्चा करूंगा।
वैसे भी, अब जबकि कॉलम को NOT NULL
. के रूप में परिभाषित किया गया है हम आगे बढ़ सकते हैं और प्राथमिक कुंजी जोड़ सकते हैं:
ALTER TABLE Colors2 ADD CONSTRAINT PK_Colors2_ColorId PRIMARY KEY CLUSTERED (ColorId);
परिणाम:
Commands completed successfully. Total execution time: 00:00:00.048
सत्यापित करने के लिए, आइए फिर से इस तालिका के लिए सभी प्राथमिक कुंजी बाधाओं की जाँच करें:
SELECT name, type, unique_index_id, is_system_named FROM sys.key_constraints WHERE type = 'PK';
परिणाम:
+------------------------------+--------+-------------------+-------------------+ | name | type | unique_index_id | is_system_named | |------------------------------+--------+-------------------+-------------------| | PK__MyTest__606C418F16F9CCCF | PK | 1 | 1 | | PK__Client__96ADCE1ACB91C2A9 | PK | 1 | 1 | | PK_Colors_ColorId | PK | 1 | 0 | | PK_Colors2_ColorId | PK | 1 | 0 | +------------------------------+--------+-------------------+-------------------+
हमारी नई प्राथमिक कुंजी जिसे हम PK_Colors2_ColorId
. कहते हैं सूची में जोड़ दिया गया है।
उदाहरण 4 - किसी स्तंभ को पहचान स्तंभ के रूप में बदलना
प्राथमिक कुंजी अक्सर पहचान कॉलम पर लागू होती हैं। पहचान कॉलम को IDENTITY
. के साथ परिभाषित किया गया है कीवर्ड, उसके बाद एक वैकल्पिक बीज और कोष्ठक के भीतर वृद्धि मूल्य।
जब तालिका में एक नई पंक्ति जोड़ी जाती है, तो SQL सर्वर पहचान कॉलम के लिए एक अद्वितीय, वृद्धिशील मान प्रदान करता है।
यदि आप एक पहचान कॉलम का उपयोग करने की योजना बना रहे हैं, तो आपको वह पहले ही करना होगा। आप किसी मौजूदा कॉलम को पहचान कॉलम के रूप में नहीं बदल सकते।
जब मैंने पहले क्वेरी चलाई, तो हम देख सकते थे कि Colors2.ColorId
कॉलम नहीं है एक पहचान कॉलम (हम इसे जानते हैं क्योंकि is_identity
0
. पर सेट है ) इसका मतलब है कि मैंने PK_Colors2_ColorId
. बनाया है गैर-पहचान कॉलम पर प्राथमिक कुंजी।
यदि हम तालिका को पहचान स्तंभ के रूप में बदलने का प्रयास करते हैं तो यहां क्या होता है:
ALTER TABLE Colors2 ALTER COLUMN ColorId int IDENTITY (1,1) NOT NULL PRIMARY KEY;
परिणाम:
Msg 156, Level 15, State 1, Line 3 Incorrect syntax near the keyword 'IDENTITY'.
जैसा कि उल्लेख किया गया है, इसे दूर करने के लिए, हमें कॉलम को छोड़ना होगा और फिर से शुरू करना होगा।
यदि कॉलम में पहले से ही डेटा है, तो आपको कुछ अतिरिक्त काम करने की आवश्यकता होगी। यह इस लेख के दायरे से बाहर है, लेकिन यहां उपरोक्त कॉलम को छोड़ने और इसे एक पहचान कॉलम के रूप में फिर से बनाने का एक उदाहरण दिया गया है:
USE Test; DROP TABLE Colors2; CREATE TABLE Colors2 ( ColorId int IDENTITY (1,1) NOT NULL PRIMARY KEY, ColorName varchar(50) );
परिणाम:
Commands completed successfully. Total execution time: 00:00:00.049
ध्यान दें कि मैंने इस बार प्राथमिक कुंजी बाधा के लिए कोई नाम नहीं दिया है। इस मामले में, सिस्टम इसके लिए एक नाम बनाएगा।
कॉलम को तुरंत जांचें:
SELECT t.name AS 'Table', c.name AS 'Column', c.is_nullable, c.is_identity FROM sys.columns c INNER JOIN sys.tables T ON c.object_id = t.object_id WHERE c.name = 'ColorId';
परिणाम:
+---------+----------+---------------+---------------+ | Table | Column | is_nullable | is_identity | |---------+----------+---------------+---------------| | Colors | ColorId | 0 | 1 | | Colors2 | ColorId | 0 | 1 | +---------+----------+---------------+---------------+
हाँ, यह अब एक पहचान स्तंभ है।
आइए इस तालिका की प्राथमिक कुंजियों पर एक और नज़र डालें:
SELECT name, type, unique_index_id, is_system_named FROM sys.key_constraints WHERE type = 'PK';
परिणाम:
+-------------------------------+--------+-------------------+-------------------+ | name | type | unique_index_id | is_system_named | |-------------------------------+--------+-------------------+-------------------| | PK__MyTest__606C418F16F9CCCF | PK | 1 | 1 | | PK__Client__96ADCE1ACB91C2A9 | PK | 1 | 1 | | PK_Colors_ColorId | PK | 1 | 0 | | PK__Colors2__8DA7674D8F57294D | PK | 1 | 1 | +-------------------------------+--------+-------------------+-------------------+
तो अब हमारे पास एक सिस्टम-नाम वाली प्राथमिक कुंजी है जिसे PK__Colors2__8DA7674D8F57294D
कहा जाता है। .