किसी मौजूदा तालिका से स्तंभ कैसे निकालें?
मेरे पास एक टेबल MEN
है Fname
औरLname
मुझे हटाने की जरूरत है Lname
यह कैसे करना है?
किसी मौजूदा तालिका से स्तंभ कैसे निकालें?
मेरे पास एक टेबल MEN
है Fname
औरLname
मुझे हटाने की जरूरत है Lname
यह कैसे करना है?
जवाबों:
ALTER TABLE MEN DROP COLUMN Lname
आपका उदाहरण सरल है और इसके लिए किसी अतिरिक्त तालिका परिवर्तन की आवश्यकता नहीं है, लेकिन आम तौर पर बोलना इतना तुच्छ नहीं है।
यदि इस स्तंभ को अन्य तालिकाओं द्वारा संदर्भित किया जाता है, तो आपको यह पता लगाने की आवश्यकता है कि अन्य तालिकाओं / स्तंभों के साथ क्या करना है। एक विकल्प विदेशी कुंजी को हटाने और अन्य तालिकाओं में संदर्भित डेटा रखना है।
एक अन्य विकल्प सभी संदर्भित स्तंभों को ढूंढना और उन्हें हटाने के साथ-साथ यदि उन्हें किसी भी समय की आवश्यकता नहीं है।
ऐसे मामलों में असली चुनौती सभी विदेशी कुंजियों को ढूंढना है। आप सिस्टम टेबल्स को क्वेरी करके या ApexSQL सर्च (फ्री) या रेड गेट डिपेंडेंसी ट्रैकर (प्रीमियम लेकिन अधिक फीचर्स) जैसे थर्ड पार्टी टूल्स का उपयोग करके ऐसा कर सकते हैं । वहाँ विदेशी कुंजी पर एक पूरी धागा यहाँ
यह सही जवाब है:
ALTER TABLE MEN DROP COLUMN Lname
लेकिन ... अगर एक CONSTRAINT
पर मौजूद है COLUMN
, तो आप चाहिए पहले, तो आप में सक्षम हो जाएगा । ड्रॉप करने के लिए :DROP
CONSTRAINT
DROP
COLUMN
CONSTRAINT
ALTER TABLE MEN DROP CONSTRAINT {constraint_name_on_column_Lname}
constraint
एक कॉलम की खोज कैसे करें ?
में SQL सर्वर 2016 आप नए DIE बयानों का उपयोग कर सकते हैं।
ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name
उपरोक्त क्वेरी को फिर से चलाने drops
योग्य है यदि यह exists
तालिका में केवल तभी है जब वह त्रुटि नहीं करेगा।
बड़े IF
रैपर का उपयोग करने के बजाय column
इसे छोड़ने से पहले इसके अस्तित्व को जांचने के लिए आप उपरोक्त DDL
कथन को चला सकते हैं
सवाल यह है कि क्या आप केवल एक तालिका को किसी अनिर्दिष्ट तालिका से हटा सकते हैं ;-)
BEGIN TRANSACTION
IF exists (SELECT * FROM sys.columns c
INNER JOIN sys.objects t ON (c.[object_id] = t.[object_id])
WHERE t.[object_id] = OBJECT_ID(N'[dbo].[MyTable]')
AND c.[name] = 'ColumnName')
BEGIN TRY
ALTER TABLE [dbo].[MyTable] DROP COLUMN ColumnName
END TRY
BEGIN CATCH
print 'FAILED!'
END CATCH
ELSE
BEGIN
SELECT ERROR_NUMBER() AS ErrorNumber;
print 'NO TABLE OR COLUMN FOUND !'
END
COMMIT
इसका सरल उत्तर इसका उपयोग करना है:
ALTER TABLE MEN DROP COLUMN Lname;
एक से अधिक कॉलम इस तरह निर्दिष्ट किए जा सकते हैं:
ALTER TABLE MEN DROP COLUMN Lname, secondcol, thirdcol;
SQL सर्वर 2016 से स्तंभ को केवल तब ही ड्रॉप करना संभव है जब वह मौजूद हो। जब कॉलम मौजूद नहीं होता है तो आपको कोई त्रुटि मिलती है जो ऐसी चीज है जिसकी आपको परवाह नहीं है।
ALTER TABLE MEN DROP COLUMN IF EXISTS Lname;
स्तंभों को छोड़ने के लिए कुछ आवश्यक शर्तें हैं। गिराए गए कॉलम नहीं हो सकते हैं:
यदि उपरोक्त में से कोई भी सत्य है, तो आपको पहले उन संघों को छोड़ने की आवश्यकता है।
इसके अलावा, यह ध्यान दिया जाना चाहिए कि एक स्तंभ छोड़ने से हार्ड डिस्क से अंतरिक्ष को पुनः प्राप्त नहीं होता है जब तक कि तालिका का क्लस्टर इंडेक्स फिर से नहीं बनाया जाता है। जैसा कि अक्सर यह एक अच्छा विचार है कि इस तरह एक तालिका पुनर्निर्माण के साथ ऊपर का पालन करें:
ALTER TABLE MEN REBUILD;
अंत में जैसा कि कुछ ने कहा है कि यह धीमा हो सकता है और संभवतः अवधि के लिए तालिका को लॉक कर देगा। वांछित संरचना के साथ एक नई तालिका बनाना संभव है और फिर इस तरह से नाम बदलें:
SELECT
Fname
-- Note LName the column not wanted is not selected
INTO
new_MEN
FROM
MEN;
EXEC sp_rename 'MEN', 'old_MEN';
EXEC sp_rename 'new_MEN', 'MEN';
DROP TABLE old_MEN;
लेकिन पहले चेतावनी और अंतिम नाम बदलने के आदेश के बीच यहाँ सम्मिलित पंक्तियों के डेटा हानि के लिए एक खिड़की है।
यह SSMS GUI के माध्यम से भी किया जा सकता है। इस पद्धति के बारे में अच्छी बात यह है कि यह आपको चेतावनी देता है यदि उस स्तंभ पर कोई संबंध हैं और स्वचालित रूप से उन लोगों को भी हटा सकता है।
जैसा कि मैंने पहले कहा था, अगर कोई रिश्ते हैं जिन्हें हटाने की भी आवश्यकता होगी, तो यह इस बिंदु पर आपसे पूछेगा कि क्या आप उन लोगों को भी हटाना चाहते हैं। स्तंभ को हटाने के लिए आपको ऐसा करने की आवश्यकता होगी।
यदि आप C # का उपयोग कर रहे हैं और आइडेंटिटी कॉलम int है, तो बिना कोई मूल्य प्रदान किए int का नया उदाहरण बनाएं। यह मेरे लिए काम करता है।
[पहचान_ कॉलम] = नया इंट ()
वाक्य - विन्यास:
ALTER TABLE TABLE_NAME DROP COLUMN COLUMN_NAME;
उदाहरण के लिए:
alter table Employee drop column address;