दिलचस्प पोस्ट
ग्रीन थ्रेड्स बनाम नॉन ग्रीन थ्रेड्स TableView से DetailView स्विफ्ट तक डेटा भेजें एस्पनेट एमवीसी 2 – एक मॉडल की संपत्ति को एक अलग नामांकित मान से बाँधें sed स्क्रिप्ट में शेल चर क्या वादा किया जा सकता है कि इसके लिए कई तर्क हैं? TINYTEXT, टेक्स्ट, MEDIUMTEXT और LONGTEXT अधिकतम संग्रहण आकार टाइप-सुरक्षित डाटाबेसिंग में सी # के लिए 'नेमफ' ऑपरेटर की कमी के लिए वैकल्पिक हल? ऑब्जेक्ट गुण सूची में उद्देश्य-सी प्राप्त करें Rownum का उपयोग कर तालिका की दूसरी पंक्ति का चयन करना एलिमेंटट्री का उपयोग करके सीडीएटीए आउटपुट कैसे करें सी #: सिंगल स्टेटमेंट में एक से अधिक वैरिएबल के लिए समान मूल्य असाइन करें परीक्षण करें कि क्या एक UIView एनीमेशन के बीच में है पायथन में एक क्रमबद्ध सरणी के सूचकांक कैसे प्राप्त करें निर्भरता इंजेक्शन के संदर्भ में एक संरचना रूट क्या है स्ट्रिंग में चरित्र के nth घटना को कैसे ढूंढें?

तालिका में किसी कॉलम से पहचान निकालें

हमारे पास 5 जीबी की तालिका है (लगभग 500 मिलियन पंक्तियां) और हम एक कॉलम पर पहचान गुण को निकालना चाहते हैं, लेकिन जब हम इसे SSMS के माध्यम से करने का प्रयास करते हैं – यह समय बाहर आता है।

क्या यह टी-एसक्यूएल के माध्यम से किया जा सकता है?

Solutions Collecting From Web of "तालिका में किसी कॉलम से पहचान निकालें"

एक बार सेट करने के बाद आप एक IDENTITY विशिष्टता नहीं हटा सकते।

पूरे कॉलम को निकालने के लिए:

 ALTER TABLE yourTable DROP COLUMN yourCOlumn; 

यहाँ पर अधिसूचना कक्ष के बारे में जानकारी

यदि आपको डेटा रखने की आवश्यकता है, लेकिन IDENTITY हटा दें, तो आपको निम्न की आवश्यकता होगी:

  • एक नया स्तंभ बनाएं
  • मौजूदा IDENTITY कॉलम से डेटा को नए कॉलम में ट्रांसफर करें
  • मौजूदा IDENTITY छोड़ दें
  • नए स्तंभ को मूल स्तंभ नाम में नाम बदलें

यह विदेशी और प्राथमिक कुंजी बाधाओं के साथ गड़बड़ हो जाता है, इसलिए यहां कुछ लिपियों की मदद से आप अपने रास्ते पर जा सकते हैं:

सबसे पहले, एक अस्थायी नाम के साथ डुप्लिकेट कॉलम बनाएं:

 alter table yourTable add tempId int NOT NULL default -1; update yourTable set tempId = id; 

इसके बाद, अपनी प्राथमिक कुंजी बाधा का नाम प्राप्त करें:

 SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_NAME = 'yourTable'; 

अब अपने कॉलम के लिए प्राथमिक कुंजी बाधा को छोड़ने का प्रयास करें:

 ALTER TABLE yourTable DROP CONSTRAINT PK_yourTable_id; 

यदि आपके पास विदेशी कुंजी है, तो यह असफल हो जाएगी, इसलिए यदि विदेशी कुंजी बाधाओं को छोड़ दें तो आप जिस प्रकार के टेबल्स को चलाते हैं उसे ट्रैक रखें ताकि आप बाद में वापस कंसल्टेंट्स जोड़ सकें !!!

 SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_NAME = 'otherTable'; alter table otherTable drop constraint fk_otherTable_yourTable; commit; .. 

आपके सभी विदेशी कुंजी बाधाओं को हटा दिए जाने के बाद, आप पीके की बाधा को हटा सकते हैं, उस कॉलम को छोड़ सकते हैं, अपने टेम्पक कॉलम का नाम बदल सकते हैं, और उस कॉलम में पीके की बाधा जोड़ सकते हैं:

 ALTER TABLE yourTable DROP CONSTRAINT PK_yourTable_id; alter table yourTable drop column id; EXEC sp_rename 'yourTable.tempId', 'id', 'COLUMN'; ALTER TABLE yourTable ADD CONSTRAINT PK_yourTable_id PRIMARY KEY (id) commit; 

अंत में, एफके की बाधाएं वापस में जोड़ें:

 alter table otherTable add constraint fk_otherTable_yourTable foreign key (yourTable_id) references yourTable(id); .. 

El Fin!

यदि आप कॉलम को पुन: क्रमबद्ध किए बिना और एक नया कॉलम जोड़ने और पॉपुल किए बिना ऐसा करना चाहते हैं, तो लगभग कोई डाउनटाइम नहीं है क्योंकि टेबल पर कोई डेटा नहीं बदल रहा है, आइए विभाजन की कार्यक्षमता के साथ कुछ जादू करते हैं (लेकिन जब तक कोई विभाजन नहीं होता है, टी एंटरप्राइज संस्करण की आवश्यकता है):

  1. इस तालिका में इंगित करने वाली सभी विदेशी कुंजियां निकालें
  2. स्क्रिप्ट को तैयार करने के लिए तालिका; सब कुछ जैसे नाम बदलें 'MyTable2', 'MyIndex2', आदि। पहचान विनिर्देश निकालें
  3. अब आपके पास दो "समान" -छोटे तालिकाओं, एक पूर्ण, कोई अन्य खाली पहचान के साथ नहीं होना चाहिए
  4. ALTER TABLE [Original] SWITCH TO [Original2] चलाएं ALTER TABLE [Original] SWITCH TO [Original2]
  5. अब आपकी मूल तालिका खाली होगी और नया डेटा होगा। आपने दो तालिकाओं (तत्काल) के लिए मेटाडेटा स्विच किया है
  6. मूल स्कीमा ऑब्जेक्ट्स को मूल नामों के नाम के लिए मूल (अब खाली तालिका), exec sys.sp_rename ड्रॉप करें, और फिर आप अपनी विदेशी कुंजी को पुन: निर्मित कर सकते हैं।

उदाहरण के लिए, दिए गए:

 CREATE TABLE Original ( Id INT IDENTITY PRIMARY KEY , Value NVARCHAR(300) ); CREATE NONCLUSTERED INDEX IX_Original_Value ON Original (Value); INSERT INTO Original SELECT 'abcd' UNION ALL SELECT 'defg'; 

आप निम्न कर सकते हैं:

 --create new table with no IDENTITY CREATE TABLE Original2 ( Id INT PRIMARY KEY , Value NVARCHAR(300) ); CREATE NONCLUSTERED INDEX IX_Original_Value2 ON Original2 (Value); --data before switch SELECT 'Original', * FROM Original UNION ALL SELECT 'Original2', * FROM Original2; ALTER TABLE Original SWITCH TO Original2; --data after switch SELECT 'Original', * FROM Original UNION ALL SELECT 'Original2', * FROM Original2; --clean up DROP TABLE Original; EXEC sys.sp_rename 'Original2.IX_Original_Value2', 'IX_Original_Value', 'INDEX'; EXEC sys.sp_rename 'Original2', 'Original', 'OBJECT'; UPDATE Original SET Id = Id + 1; SELECT * FROM Original; 

मुझे सिर्फ यही समस्या थी जीएसआई का उपयोग करने के बजाय एसएसएमएस में 4 स्टेटमेंट और यह बहुत तेजी से था।

  • एक नया स्तंभ बनाएं

    alter table users add newusernum int;

  • मूल्यों को कॉपी करें

    update users set newusernum=usernum;

  • पुराने कॉलम ड्रॉप करें

    alter table users drop column usernum;

  • नए कॉलम को पुराने कॉलम नाम में नाम बदलें

    EXEC sp_RENAME 'users.newusernum' , 'usernum', 'COLUMN';

निम्नलिखित स्क्रिप्ट 'आईडी' नामक कॉलम के लिए पहचान फ़ील्ड को निकाल देता है

आशा करता हूँ की ये काम करेगा।

 BEGIN TRAN BEGIN TRY EXEC sp_rename '[SomeTable].[Id]', 'OldId'; ALTER TABLE [SomeTable] ADD Id int NULL EXEC ('UPDATE [SomeTable] SET Id = OldId') ALTER TABLE [SomeTable] NOCHECK CONSTRAINT ALL ALTER TABLE [SomeTable] DROP CONSTRAINT [PK_constraintName]; ALTER TABLE [SomeTable] DROP COLUMN OldId ALTER TABLE [SomeTable] ALTER COLUMN [Id] INTEGER NOT NULL ALTER TABLE [SomeTable] ADD CONSTRAINT PK_JobInfo PRIMARY KEY (Id) ALTER TABLE [SomeTable] CHECK CONSTRAINT ALL COMMIT TRAN END TRY BEGIN CATCH ROLLBACK TRAN SELECT ERROR_MESSAGE () END CATCH 

Bellow कोड को ठीक से काम करते हैं, जब हमें पता स्तंभ नाम नहीं पता है

और इनवॉइस_डेलेटीड जैसे डेटा को नई अस्थायी तालिका में कॉपी करना चाहते हैं और अगली बार जब हम उपयोग करते हैं: इनवॉइस_डेलेट में चयन करें * चालान से * जहां …

 SELECT t1.* INTO Invoice_DELETED FROM Invoice t1 LEFT JOIN Invoice ON 1 = 0 --WHERE t1.InvoiceID = @InvoiceID 

'एंड्री एम' के लिए विशेष धन्यवाद

अधिक स्पष्टीकरण के लिए देखें: https://dba.stackexchange.com/a/138345/101038