2013-02-01 12 views
24

मेरे पास डीबी में एक कॉलम है जिसमें 5 कॉलम हैं लेकिन कोई प्राथमिक कुंजी नहीं है। कॉलम में से एक को myTable_id नाम दिया गया है और पूर्णांक है।तालिका में प्राथमिक कुंजी के रूप में कॉलम सेट करें यदि तालिका में प्राथमिक कुंजी नहीं है

मैं यह जांचना चाहता हूं कि तालिका में प्राथमिक कुंजी कॉलम है या नहीं। यदि ऐसा नहीं होता है, तो myTable_id को प्राथमिक कुंजी कॉलम बनाएं और इसे पहचान कॉलम बनाएं। क्या इसे करने का कोई तरीका है?

मैं इस के साथ करने की कोशिश की:

ALTER TABLE Persons 
DROP CONSTRAINT pk_PersonID 

ALTER TABLE Persons 
ADD PRIMARY KEY (P_Id) 

और मैं प्रबंधन स्टूडियो में सिंटेक्स त्रुटि मिलता है।

+3

आपको एक उत्तर को स्वीकृत के रूप में चिह्नित करना चाहिए। –

उत्तर

9
ALTER TABLE Persons 
ADD CONSTRAINT pk_PersonID PRIMARY KEY (P_Id) 
+1

पहचान कॉलम के बारे में कैसे? –

+0

"मैं यह जांचना चाहता हूं कि तालिका में प्राथमिक कुंजी कॉलम है या नहीं" को संबोधित किया गया था। – Monkey

43

यह जाँच करता है, तो प्राथमिक कुंजी मौजूद है, नहीं तो यह

IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
WHERE CONSTRAINT_TYPE = 'PRIMARY KEY' AND TABLE_NAME = 'Persons' 
AND TABLE_SCHEMA ='dbo') 
BEGIN 
    ALTER TABLE Persons ADD CONSTRAINT pk_PersonID PRIMARY KEY (P_Id) 
END 
ELSE 
BEGIN 
    -- Key exists 
END 

बनाई गई है बेला: http://sqlfiddle.com/#!6/e165d/2

0

मुझे नहीं लगता कि आप ऐसा कर सकते हैं। पहचान कॉलम में कॉलम बनाने के लिए मुझे लगता है कि आपको टेबल को पूरी तरह से छोड़ना है।

+1

आप पहचान में परिवर्तित नहीं हो सकते हैं लेकिन आप एक तालिका में एक पहचान जोड़ सकते हैं – Paparazzi

2

आप जांच सकते हैं कि प्राथमिक कुंजी मौजूद है या OBJECTPROPERTY लेनदेन एसक्यूएल का उपयोग नहीं कर रहा है, दूसरे तर्कों के लिए 'TableHasPrimaryKey' का उपयोग करें।

DECLARE @ISHASPRIMARYKEY INT; 

SELECT @ISHASPRIMARYKEY = OBJECTPROPERTY(OBJECT_ID('PERSONS'), 'TABLEHASPRIMARYKEY'); 
IF @ISHASPRIMARYKEY IS NULL 
BEGIN 
    -- generate identity column 
    ALTER TABLE PERSONS 
    DROP COLUMN P_ID; 

    ALTER TABLE PERSONS 
    ADD P_ID INT IDENTITY(1,1); 

    -- add primary key 
    ALTER TABLE PERSONS 
    ADD CONSTRAINT PK_PERSONID PRIMARY KEY (P_ID); 

END; 
+1

मुझे लगता है कि @ISHASPRIMARYKEY केवल तभी होगा जब व्यक्ति तालिका मौजूद न हो, अन्यथा यह प्राथमिक कुंजी के अस्तित्व के आधार पर 0 या 1 होगा । – KnarfaLingus

+0

@KnarfaLingus - आप सही हैं। मैंने एक संपादन किया है लेकिन इस समय मेरा प्रतिनिधि पर्याप्त नहीं है इसलिए मुझे इसे अनुमोदित होने की प्रतीक्षा करनी है। –

2

एक IDENTITY बाधा मौजूदा स्तंभ को नहीं जोड़ा जा सकता है, तो आप कैसे जोड़ने के इस अपने प्रारंभिक सोचा की जरूरत है। वहाँ दो विकल्प हैं:

  1. पहचान के साथ एक प्राथमिक कुंजी सहित एक नया टेबल बना सकते हैं और मौजूदा तालिका ड्रॉप
  2. पहचान के साथ एक नया प्राथमिक कुंजी स्तंभ बनाएं और मौजूदा 'P_ID' कॉलम ड्रॉप

एक तीसरा तरीका है, जो ALTER TABLE...SWITCH कथन के माध्यम से बहुत बड़ी तालिकाओं के लिए एक बेहतर तरीका है। प्रत्येक के उदाहरण के लिए Adding an IDENTITY to an existing column देखें। इस सवाल का जवाब में, यदि तालिका बहुत बड़ी नहीं है, मैं चलाने का सुझाव देंगे निम्नलिखित:

-- Check that the table/column exist and no primary key is already on the table. 
IF COL_LENGTH('PERSONS','P_ID') IS NOT NULL 
    AND NOT EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
        WHERE CONSTRAINT_TYPE = 'PRIMARY KEY' AND TABLE_NAME = 'PERSONS') 
        -- Add table schema to the WHERE clause above e.g. AND TABLE_SCHEMA ='dbo' 
BEGIN 
    ALTER TABLE PERSONS  
    ADD P_ID_new int IDENTITY(1, 1) 
    GO 

    ALTER TABLE PERSONS 
    DROP COLUMN P_ID 
    GO 

    EXEC sp_rename 'PERSONS.P_ID_new', 'P_ID', 'Column' 
    GO 

    ALTER TABLE PERSONS 
    ADD CONSTRAINT PK_P_ID PRIMARY KEY CLUSTERED (P_ID) 
    GO 
END 

नोट्स: स्पष्ट CONSTRAINT कीवर्ड प्राथमिक कुंजी बाधा का उपयोग करके बजाय एक विशेष नाम दिया जाता है एक नाम स्वत: असाइन करने के लिए SQL सर्वर के आधार पर।

केवल CLUSTEREDPRIMARY KEY पर शामिल करता है, तो एक विशेष P_ID के लिए खोजों की संतुलन और कुछ अन्य सूचकांक के आधार पर तालिका क्लस्टरिंग के लाभ outweighs लेखन की राशि। Create SQL IDENTITY as PRIMARY KEY देखें।

संबंधित मुद्दे