SQL में, ALTER TABLE
कथन मौजूदा तालिका की परिभाषा को संशोधित करता है।
आप ALTER TABLE
use का उपयोग कर सकते हैं कॉलम और बाधाओं को बदलने, जोड़ने या छोड़ने के लिए।
आपके DBMS के आधार पर, ALTER TABLE
स्टेटमेंट का उपयोग विभाजन को फिर से असाइन करने और पुनर्निर्माण करने, या बाधाओं और ट्रिगर को अक्षम और सक्षम करने के लिए भी किया जा सकता है।
सिंटैक्स
ALTER TABLE
बयान आम तौर पर इस तरह जाता है:
ALTER TABLE table_name
[alter_option [, alter_option] ...]
[partition_options]
कहां:
table_name
उस तालिका का नाम है जिसे आप बदलना चाहते हैं।[alter_option [, alter_option] …]
उन विशिष्ट परिवर्तनों की एक सूची है जो आप करना चाहते हैं (उदाहरण के लिएADD
उसके बाद कॉलम का नाम और परिभाषा, याDROP COLUMN
उसके बाद कॉलम का नाम, आदि)।[partition_options]
विशेष रूप से विभाजित तालिकाओं के लिए विकल्पों की एक वैकल्पिक सूची है। सभी डीबीएमएस विभाजित तालिकाओं का समर्थन नहीं करते हैं। यदि आपका है, तो ऐसे विकल्प आपको विभाजन जोड़ने, छोड़ने, त्यागने, आयात करने, मर्ज करने या विभाजित करने, या विभाजन रखरखाव करने में सक्षम कर सकते हैं।
ALTER TABLE
. के लिए पूर्ण सिंटैक्स काफी जटिल हो सकता है और डीबीएमएस के बीच काफी भिन्न हो सकता है। इस लेख में शामिल नहीं की गई किसी भी चीज़ के लिए, अपने DBMS दस्तावेज़ देखें।
नीचे सबसे सामान्य ALTER TABLE
. के उदाहरण दिए गए हैं संचालन।
नया कॉलम जोड़ें
तालिका में नया कॉलम जोड़ने के लिए, ADD
. का उपयोग करें क्लॉज, उसके बाद कॉलम का नाम और डेटा टाइप।
ALTER TABLE Products
ADD ProductDescription varchar(500);
यह ProductDescription
. नामक एक नया कॉलम जोड़ता है Products
. के लिए टेबल।
इस उदाहरण में, हमने कॉलम को varchar(500)
. बनाया है लेकिन आप अपने नए कॉलम के लिए जो भी डेटा प्रकार उपयुक्त है उसका उपयोग करेंगे।
आप अपनी कॉलम परिभाषा में बाधाओं को भी शामिल कर सकते हैं, लेकिन यह आपके DBMS पर निर्भर हो सकता है, और तालिका में पहले से ही डेटा है या नहीं (इस बारे में नीचे चर्चा देखें)।
कॉलम का नाम बदलें
अधिकांश प्रमुख RDBMS (PostgreSQL, Oracle, SQLite, MySQL 8.0+, MariaDB 10.5.2+) आपको इस तरह के कॉलम का नाम बदलने की अनुमति देते हैं:
ALTER TABLE table_name
RENAME COLUMN column_name TO new_column_name;
यदि आप संस्करण 8.0 से पहले MySQL या 10.5.2+ से पहले MariaDB का उपयोग कर रहे हैं, तो आपको CHANGE COLUMN
का उपयोग करना होगा इसके बजाय सिंटैक्स, जिसके लिए आपको डेटाटाइप को निर्दिष्ट करने की भी आवश्यकता होती है। इस तरह:
ALTER TABLE table_name
CHANGE COLUMN old_column_name new_column_name datatype;
SQL सर्वर में, आपको sp_rename
. का उपयोग करना होगा कॉलम का नाम बदलने के लिए संग्रहीत प्रक्रिया। इस तरह:
EXEC sp_rename 'schema_name.table_name.column_name', 'new_column_name', 'COLUMN';
एक कॉलम छोड़ें
कॉलम ड्रॉप करने के लिए, DROP COLUMN
का उपयोग करें क्लॉज, उसके बाद कॉलम का नाम।
ALTER TABLE table_name
DROP COLUMN column_name;
कॉलम की परिभाषा में बदलाव करें
मौजूदा कॉलम की परिभाषा को संशोधित करने के लिए सिंटैक्स डीबीएमएस के बीच काफी भिन्न होता है। यह इस बात पर भी निर्भर करता है कि आपको कौन से संशोधन करने की आवश्यकता है।
चीजों को सरल रखने के लिए, SQL सर्वर में एक कॉलम में एक साधारण संशोधन करते हैं:
ALTER TABLE Products
ALTER COLUMN ProductDescription varchar(1000);
इस उदाहरण में, हमने ProductDescription
. को बदल दिया है varchar(500)
. से कॉलम से varchar(1000)
।
निम्नलिखित प्रत्येक DBMS द्वारा समान या समान परिवर्तन करने के लिए आवश्यक मूल सिंटैक्स को दर्शाता है।
SQL सर्वर:
ALTER TABLE table_name
ALTER COLUMN column_name datatype;
पोस्टग्रेएसक्यूएल:
ALTER TABLE table_name
ALTER COLUMN column_name TYPE datatype;
10g से पहले MySQL, MariaDB और Oracle:
ALTER TABLE table_name
MODIFY COLUMN column_name datatype;
Oracle 10g और बाद में:
ALTER TABLE table_name
MODIFY column_name datatype;
SQLite आपको किसी कॉलम का नाम बदलने के अलावा उसे संशोधित नहीं करने देगा।
प्रत्येक डीबीएमएस के लिए वास्तविक सिंटैक्स आमतौर पर इससे कहीं अधिक जटिल होता है, और यह इस बात पर निर्भर करता है कि आप क्या करने की कोशिश कर रहे हैं। हालांकि, यह आपको बुनियादी कॉलम संशोधनों के साथ आरंभ करना चाहिए।
प्रतिबंध और विचार
डेटा होने के बाद आपको आमतौर पर तालिकाओं में संशोधन करने से बचना चाहिए। परिवर्तन करने से, आप मौजूदा डेटा खोने का जोखिम उठाते हैं।
ऐसा कहने के बाद, तालिका में डेटा होने के बाद, कई डीबीएमएस वास्तव में आपको कुछ बदलाव करने से रोकते हैं। उदाहरण के लिए, आप पा सकते हैं कि आप NOT NULL
नहीं जोड़ सकते हैं डेटा वाले कॉलम के लिए बाधा।
कुछ DBMS आपको ऐसा करने की अनुमति दे सकते हैं, जब तक कि आप DEFAULT
. का उपयोग करते हैं बाधा (उन स्तंभों के लिए एक डिफ़ॉल्ट मान प्रदान करने के लिए जिनमें डेटा स्पष्ट रूप से सम्मिलित नहीं किया गया है), या एक पहचान/ऑटोइनक्रिकमेंट कॉलम, या एक टाइमस्टैम्प कॉलम, आदि।
कुछ DBMS आपको किसी तालिका में कॉलम छोड़ने या बदलने की अनुमति नहीं देते हैं।
साथ ही, कुछ DBMS उन डेटाटाइप्स को प्रतिबंधित करते हैं जिन्हें जोड़ा जा सकता है।
उदाहरण - एक पूर्ण बाधा नहीं जोड़ना
उपरोक्त बिंदुओं को प्रदर्शित करने में सहायता के लिए यहां एक उदाहरण दिया गया है।
यहाँ क्या होता है जब मैं एक NOT NULL
के साथ एक कॉलम जोड़ने का प्रयास करता हूँ SQL सर्वर में बाधा।
ALTER TABLE Products
ADD ProductDescription varchar(500) NOT NULL;
परिणाम:
Msg 4901, Level 16, State 1, Line 1 ALTER TABLE only allows columns to be added that can contain nulls, or have a DEFAULT definition specified, or the column being added is an identity or timestamp column, or alternatively if none of the previous conditions are satisfied the table must be empty to allow addition of this column. Column 'ProductDescription' cannot be added to non-empty table 'Products' because it does not satisfy these conditions.
मूल रूप से, तालिका में पहले से ही डेटा है, और इसलिए SQL सर्वर एक त्रुटि देता है जो मुझे बताता है कि मैं केवल एक NOT NULL
जोड़ सकता हूं बाधा यदि तालिका कुछ मानदंडों को पूरा करती है, और यह अभी तक उस मानदंड को पूरा नहीं करती है।
और उस मानदंड का एक अच्छा कारण है।
एक NOT NULL
बाधा सुनिश्चित करती है कि कोई NULL
नहीं है किसी भी पंक्ति में कॉलम में मान। समस्या यह है कि हमारे पास पहले से ही तालिका में डेटा है, और यदि हम एक नया कॉलम जोड़ते हैं, तो वे मौजूदा पंक्तियाँ NULL
होंगी। - जो तुरंत हमारे NOT NULL
. का उल्लंघन करेगा बाधा इसलिए हमें मौजूदा पंक्तियों में जाने के लिए डेटा निर्दिष्ट करने की आवश्यकता है।
ऐसा करने के लिए, हम एक DEFAULT
जोड़ सकते हैं यह सुनिश्चित करने के लिए कि कोई भी मौजूदा पंक्तियाँ स्वचालित रूप से इस कॉलम में डेटा से भर जाती हैं।
उदाहरण:
ALTER TABLE Products
ADD ProductDescription varchar(500) NOT NULL DEFAULT 'N/A';
यह बस एक DEFAULT
adds जोड़ता है स्तंभ के लिए बाधा। यह बाधा सुनिश्चित करती है कि सभी पंक्तियों में एक मान हो (इस मामले में, मान N/A
. है ) यदि उन्हें कोई मान निर्दिष्ट नहीं किया गया है। इसका मतलब है हमारा NOT NULL
बाधा का उल्लंघन नहीं किया जाएगा, क्योंकि सभी मौजूदा पंक्तियों में अब एक मान होगा।
यदि नए कॉलम में अद्वितीय, बढ़ते हुए मान होने चाहिए, तो आप इसके बजाय इसे एक IDENTITY
बना सकते हैं कॉलम (या AUTOINCREMENT
SQLite और अन्य DBMS में)।
हालांकि, यदि तालिका में पहले से डेटा नहीं है, तो आप इनमें से कोई भी चरण किए बिना कॉलम जोड़ने में सक्षम हो सकते हैं।
विभाजन विकल्प
यह लेख शुरुआती लोगों के लिए है, और विभाजित टेबल एक शुरुआती ट्यूटोरियल के दायरे से थोड़ा बाहर हैं।
ऐसा कहने के बाद, मैं ALTER TABLE
के संबंध में कुछ विभाजन विकल्पों पर शीघ्रता से विचार करूंगा। बयान।
यदि आपका डीबीएमएस विभाजित तालिकाओं का समर्थन करता है, तो यह संभवत:ALTER TABLE
के साथ विभाजन विकल्प भी प्रदान करता है। बयान।
उदाहरण के लिए, MySQL में आप निम्न कार्य कर सकते हैं:
ALTER TABLE Products
PARTITION BY HASH(ProductId)
PARTITIONS 8;
यह तालिका को HASH
. द्वारा 8 विभाजनों में विभाजित करता है , ProductId
. का उपयोग करके विभाजन कुंजी के रूप में कॉलम।
PARTITION BY HASH
शेष अभिव्यक्ति का उपयोग करता है (इस मामले में ProductId
कॉलम) को विभाजनों की संख्या (यानी मापांक) से विभाजित किया जाता है।
आप श्रेणी विभाजन का भी उपयोग कर सकते हैं। यहां बताया गया है कि आप किसी मौजूदा तालिका में श्रेणी विभाजन कैसे जोड़ सकते हैं:
ALTER TABLE Products
ADD PARTITION (PARTITION Partition9 VALUES LESS THAN (2020));
इस उदाहरण का तात्पर्य है कि Products
तालिका में पहले से ही 8 श्रेणी विभाजन हैं, और हम Partition9
. नामक एक और विभाजन जोड़ रहे हैं ।
आप इस तरह विभाजन छोड़ सकते हैं:
ALTER TABLE Products
DROP PARTITION Partition8, Partition9;
ध्यान रखें कि ये उदाहरण MySQL के लिए हैं।
मैंने SQL सर्वर में विभाजित तालिकाओं के संबंध में कुछ लेख भी लिखे हैं। ALTER TABLE
. के संबंध में विवरण, यहां बताया गया है कि एक विभाजन को कैसे स्विच किया जाए और यहां एक विभाजन में स्विच करने का तरीका बताया गया है (दोनों ALTER TABLE
के साथ किए जाते हैं। )।
SQL सर्वर में, कुछ विभाजन विकल्पों को अन्य कथनों के साथ करने की आवश्यकता होती है। उदाहरण के लिए मर्जिंग पार्टिशन ALTER PARTITION FUNCTION
. के साथ किया जाता है स्टेटमेंट, और विभाजन विभाजन ALTER PARTITION SCHEME
. के साथ किया जाता है बयान।
यदि आप SQL सर्वर में विभाजित तालिकाओं के बारे में अधिक जानना चाहते हैं, तो यहां SQL सर्वर में विभाजित तालिका बनाने का तरीका बताया गया है।
ALTER TABLE
SQLite में
मुझे यह भी उल्लेख करना चाहिए कि SQLite के पास ALTER TABLE
. का बहुत सीमित समर्थन है बयान। SQLite में, ALTER TABLE
कथन आपको किसी तालिका का नाम बदलने, किसी तालिका के भीतर किसी स्तंभ का नाम बदलने, या किसी मौजूदा तालिका में एक नया स्तंभ जोड़ने की अनुमति देता है।
किसी भी अन्य परिवर्तन के लिए आपको तालिका छोड़नी होगी और फिर से शुरू करना होगा। यह विदेशी कुंजियों को जोड़ने पर भी लागू होता है।