2011-12-28 20 views
10

मेरे पास लगभग 10 मिलियन पंक्तियां हैं। हमने इसे SQL सर्वर प्रबंधन स्टूडियो के साथ किसी अन्य डेटाबेस से आयात किया है। यह तालिका बनाता है लेकिन प्राथमिक कुंजी कॉलम पर पहचान और प्राथमिक कुंजी के बिना।SQL सर्वर में कॉलम में पहचान कैसे जोड़ें?

मैं प्राथमिक कुंजी जोड़ सकता है लेकिन पहचान नहीं जोड़ सके। जब मैं इसे डिजाइनर में कर रहा हूं तो यह हर समय समाप्त हो रहा है। यहां तक ​​कि मेरे पास समय 0.

करने के लिए सेटिंग्स निर्धारित मैं शायद एक और स्तंभ सेट प्राथमिक कुंजी और पहचान बनाने के लिए, वर्ष से डेटा कॉपी की जरूरत है, पुराने कॉलम हटा सकते हैं और नया नाम बदलें।

किसी को भी मुझे दिखा सकते हैं क्या इस तरह के बड़े तालिकाओं के लिए यह करने के लिए सबसे अच्छा तरीका हो जाएगा, अतिरिक्त गर्म होने के बिना?

+0

तो इस तरह से कुछ आपको टाइमआउट देता है? 'तालिका तालिका नाम बदलें आईडी पहचान पहचान (1, 1) प्राथमिक कुंजी' –

+1

आप इसे लगभग तुरंत करने के लिए 'वैकल्पिक तालिका ... स्विच' का उपयोग कर सकते हैं। यहां तक ​​कि 10 मिलियन पंक्ति तालिका पर भी। –

+0

संभावित डुप्लिकेट [किसी डेटा हानि के बिना तालिका बनाने के बाद ऑटो वृद्धि कैसे सेट करें?] (Http://stackoverflow.com/questions/6084572/how-to-set-auto-increment-after-creating-a-table बिना किसी डेटा-हानि) –

उत्तर

4

ठीक है:

create table YourTable (id int, value varchar(50)) 

आप इस स्क्रिप्ट का उपयोग कर सकते हैं। मैं मौजूदा प्राथमिक कॉलम में 10 मिलियन रिकॉर्ड के साथ पहचान जोड़ने में सक्षम था। मुझे लगभग 30 मिनट ले गए।

कदम: एकल उपयोगकर्ता मोड में डेटाबेस

  1. बदलें

  2. डिजाइनर मोड में खोलें तालिका

  3. मेक (सुनिश्चित करें कि databse करने के लिए कोई अन्य कनेक्शन, ताला पैदा कर सकता है बनाने के लिए) परिवर्तन। न सहेजें

  4. उत्पन्न स्क्रिप्ट बदलें बटन पर क्लिक करें (आमतौर पर पर सही वस्तु एक्सप्लोरर ऊपर छोड़ दिया)

  5. स्क्रिप्ट उत्पन्न कॉपी
  6. बंद डिजाइनर विंडो (आप समय में केवल एक उदाहरण चला सकते हैं)
  7. ओपन नई विंडो
  8. स्क्रिप्ट

  9. हो गया निष्पादित। अब आपके कॉलम की पहचान है :)

+1

स्क्रिप्ट की जांच करें। मैं सकारात्मक हूं कि यह एक नई टेबल बनाता है, सभी डेटा कॉपी करता है और फिर मूल तालिका को छोड़ देता है। – Bill

+1

यदि आपने मेरे लिंक का पालन किया था तो इसे 30 सेकंड में किया जा सकता था! –

11

आप IDENTITY को मौजूदा कॉलम में नहीं जोड़ सकते हैं। यह सिर्फ नहीं किया जा सकता है।

आप एक नई प्रकार INT IDENTITY के स्तंभ बनाने के लिए और फिर छोड़ पुराने कॉलम अब आपको आवश्यकता नहीं है (और संभवतः पुराने नाम को नया स्तंभ का नाम बदलने - कि अगर जरूरत है) की आवश्यकता होगी

इसके अलावा: मैं नहीं इस दृश्य डिजाइनर में करना होगा - इस पुराने तालिका ड्रॉप, नई संरचना के साथ तालिका पुन: बनाने की कोशिश करेंगे सभी डेटा (सभी 10 लाखों लोगों की पंक्तियाँ) पर कॉपी करें, और तब।

यह सीधे टी SQL कथन का उपयोग करने के और अधिक कुशल है - यह कर देगा एक "यथा-स्थान" अद्यतन, गैर विनाशकारी (कोई डेटा खो दिया है), और यह 10 लाखों लोगों के आसपास नकल करने की जरूरत नहीं है इस प्रक्रिया में पंक्तियों ...

ALTER TABLE dbo.YourTable 
    ADD NewID INT IDENTITY(1,1) NOT NULL 

जब आप अपनी तालिका में प्रकार INT IDENTITY का कोई नया स्तंभ जोड़ने, तो उसे अपने लगातार संख्या के साथ भरे जाएंगे। आप इसे होने से रोक नहीं सकते हैं, और आप बाद में मूल्यों को भी अपडेट नहीं कर सकते हैं।

  • नई तालिका बनाने: -

    न तो उन विकल्पों में से, वास्तव में बहुत उपयोगी है अंत में आप अलग अलग आईडी मूल्यों के साथ खत्म हो सकता है .... यह सही करने के लिए, आप होगा समय से आगे, उचित संरचना और IDENTITY पहले से ही जगह में साथ

  • तो मानों अनुमति देने के लिए है कि मेज पर SET IDENTITY_INSERT (yourtable) ON पर बारी
  • बारी बंद मूल स्रोत से इस डेटा पर पहचान स्तंभ में सम्मिलित करने के
  • प्रतिलिपि पहचान डालने agai n: SET IDENTITY_INSERT (yourtable) OFF

केवल इस दृष्टिकोण के साथ आप अपनी नई तालिका में पहचान आईडी में एक ही आईडी प्राप्त कर पाएंगे।

+1

आप सभी संपत्तियों और उद्देश्यों को पहचान संपत्ति को छोड़कर एक ही संरचना के साथ एक नई तालिका बनाकर मौजूदा कॉलम में 'पहचान' जोड़ सकते हैं। पुरानी तालिका को नई तालिका में बदलकर पुरानी तालिका छोड़कर और तालिका का नाम बदलना। यह डेटा पृष्ठों को छूता है। –

+0

मैं आपसे असहमत हूं। मैंने बस उस तालिका पर प्राथमिक कुंजी और पहचान कॉलम जोड़ने की कोशिश की जिसमें डिजाइनर मोड में 800K पंक्तियां हैं। और यह सफलतापूर्वक पूरा हुआ। – German

+0

@ मार्टिनस्मिथ: और यह दो गैर-विभाजित तालिकाओं के साथ भी काम करता है ?? –

2

identity कॉलम सेट करने का एक तरीका insert के दौरान set identity_insert विकल्प के साथ है।उदाहरण के लिए, identity को इस तालिका में id बदलने के लिए:

-- Create empty table as a copy of the original 
select top 0 * into YourTable_New from YourTable 

-- Drop the old ID column 
alter table YourTable_New drop column id 

-- Add a new ID column with identity 
alter table YourTable_New add id int identity 

-- Copy the old values into the identity column 
set identity_insert YourTable_New on 
insert YourTable_New (id, value) select id, value from YourTable 
set identity_insert YourTable_New off 

-- Drop the old table and rename the new one 
drop table YourTable 
exec sp_RENAME 'YourTable_New' , 'YourTable' 
3

आप मौजूदा कॉलम में पहचान जोड़ सकते हैं। यह सिर्फ किया जा सकता है। एसएसएमएस में बस टूल्स पर जाएं -> विकल्प -> डिजाइनर -> टेबल और डाटाबेस डिज़ाइनर और अनचेक विकल्प तालिका को पुन: निर्माण की आवश्यकता वाले परिवर्तनों को सहेजना रोकें।

अब आवश्यक कॉलम में डिज़ाइनर मोड में पहचान जोड़ें और सहेजें।

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