2012-02-06 18 views
15

में प्राथमिक कुंजी कॉलम जोड़ें मैं आरडीबीएमएस के छात्र हूं।एसक्यूएल तालिका

मेरे पास बहुत बुनियादी सवाल है कि मेरे पास SQL ​​सर्वर में एक मौजूदा तालिका है। तालिका बदलने के लिए स्क्रिप्ट क्या होगी।

  • ड्रॉप कॉलम 'पंक्ति आईडी' मौजूद है।
  • मौजूद होने पर ड्रॉप तनाव।
  • तालिका में एक नया कॉलम 'RowId' जोड़ें।
  • इस कॉलम को प्राथमिक कुंजी के रूप में बनाएं।
  • Autoincrement प्रकार int।

    -- drop PK constraint if it exists 
    IF EXISTS (SELECT * FROM sys.key_constraints WHERE type = 'PK' AND parent_object_id = OBJECT_ID('dbo.YourTable') AND Name = 'PK_YourTable') 
        ALTER TABLE dbo.YourTable 
        DROP CONSTRAINT PK_YourTable 
    GO 
    
    -- drop column if it already exists 
    IF EXISTS (SELECT * FROM sys.columns WHERE Name = 'RowId' AND object_id = OBJECT_ID('dbo.YourTable')) 
        ALTER TABLE dbo.YourTable DROP COLUMN RowId 
    GO 
    
    -- add new "RowId" column, make it IDENTITY (= auto-incrementing) 
    ALTER TABLE dbo.YourTable 
    ADD RowId INT IDENTITY(1,1) 
    GO 
    
    -- add new primary key constraint on new column 
    ALTER TABLE dbo.YourTable 
    ADD CONSTRAINT PK_YourTable 
    PRIMARY KEY CLUSTERED (RowId) 
    GO 
    
    बेशक

    , इस स्क्रिप्ट अभी भी विफल हो सकता है, अगर अन्य तालिकाओं पूर्व पर विदेशी कुंजी की कमी का उपयोग कर इस dbo.YourTable संदर्भित कर रहे हैं:

+1

कॉलम छोड़ना और प्राथमिक कुंजी बाधा को हटाने से अलग-अलग चीजें हैं। आपकी पहली पंक्ति स्पष्ट नहीं है। क्या आप इस पर अपना प्रयास भी पोस्ट कर सकते हैं और समझा सकते हैं कि आप कहां फंस गए हैं? – Oded

+0

आप वास्तव में क्या चाहते हैं? –

+0

क्या आप पूरे अनुक्रम पूर्ण होने तक "पुराना" RowId को संरक्षित नहीं करना चाहते हैं? क्या यह "पुराना" RowId पहचान भी होने की उम्मीद है? एक ही नाम के साथ कॉलम को प्रतिस्थापित क्यों करें? – gbn

उत्तर

38

SQL सर्वर 2005 या नए में, आप इस स्क्रिप्ट का उपयोग कर सकता है मौजूदा RowId स्तंभ ...

अद्यतन: और पाठ्यक्रम की , कहीं भी मैं dbo.YourTable या PK_YourTable उपयोग करते हैं, आप को बदलने के लिए अपने स्वयं के डेटाबेस से वास्तविक तालिका/बाधा नाम के साथ उन प्लेसहोल्डर (आप वे क्या कर रहे थे, अपने प्रश्न में उल्लेख नहीं किया .....)

+0

तालिका किसी भी जगह पर पुनर्विचार नहीं कर रही है लेकिन यह अभी भी विफल हो गई है ... –

+0

संदेश 5074, स्तर 16, राज्य 1, रेखा 4 ऑब्जेक्ट 'PK_tempTable' कॉलम 'RowId' पर निर्भर है। –

+0

ठीक है, फिर एक 'वैकल्पिक तालिका dbo.YourTable ड्रॉप CONSTRAINT PK_tempTable' शामिल करें - क्या पीके तालिका नाम से कुछ और कहा जाता है ??? यदि आपकी बाधा को 'PK_YourTable'' नहीं कहा जाता है, तो आपको निश्चित रूप से ** मेरी स्क्रिप्ट को अनुकूलित करना होगा ** बेशक! –

7

नोट: इस सवालों के जवाब देने से पहले जोड़ा गया है अद्यतन

  • नया स्तंभ जोड़ें (ध्यान दें: आप केवल तालिका के अनुसार एक पहचान स्तंभ हो सकते हैं)
  • ड्रॉप वर्ष प्राथमिक कुंजी
  • नया प्राथमिक कुंजी
  • ड्रॉप वर्ष स्तंभ जोड़ें यदि
  • जरूरत

नमूना स्क्रिप्ट:

CREATE TABLE whatever (
    OldPKColumn uniqueidentifier NOT NULL, 
    CONSTRAINT PK_whatever PRIMARY KEY (OldPKColumn) 
    ) 

ALTER TABLE whatever 
    ADD RowId int NOT NULL IDENTITY (1,1); 

ALTER TABLE whatever 
    DROP CONSTRAINT PK_whatever; 

ALTER TABLE whatever WITH CHECK 
    ADD CONSTRAINT PK_whatever PRIMARY KEY CLUSTERED (RowId); 

ALTER TABLE whatever 
    DROP COLUMN oldPKcolumn; 

और एक यादृच्छिक सोचा ... आप एक पहचान स्तंभ रीसेट करने का प्रयास कर रहे हैं?
यदि हां, तो DBCC CHECKIDENT

+7

@ एसओएफ उपयोगकर्ता: मेरे पास एक बेहतर विचार है। एक बेहतर सवाल पूछें और कठोर मत बनो। जब मैं जवाब दे रहा था तब आपने सवाल बदल दिया, और मैंने एक टिप्पणी में स्पष्टीकरण मांगा। – gbn

1

बस एक टिप्पणी का उपयोग इन महान जवाब में सुधार करने के (अभी तक टिप्पणियों का उपयोग नहीं कर सकते हैं - मुझे लगता है कि विशेषाधिकार से एक प्रतिष्ठा बिंदु दूर हूँ) और खुद के लिए भविष्य में संदर्भ के रूप में:

एक नई पहचान (autonumber) स्तंभ जोड़ा गया है और एक भी बयान में प्राथमिक कुंजी के रूप में अच्छी तरह से किया जा सकता है:

ALTER तालिका जो कुछ भी जोड़ें RowID पूर्णांक पहचान नहीं NULL प्राथमिक कुंजी;

मैं मदद नहीं करता है जब मैं बाधाओं के नाम से परेशान नहीं करना पसंद करता हूं।

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