Sqlite में तालिका में नया कॉलम डालें?


354

मैं कॉलम युक्त तालिका है name, qty, rate। अब मुझे और कॉलम के COLNewबीच में एक नया कॉलम जोड़ना होगा । मैं दो कॉलमों के बीच एक नया कॉलम कैसे जोड़ूं?nameqty

जवाबों:


677

आपके पास दो विकल्प हैं। सबसे पहले, आप बस निम्नलिखित के साथ एक नया कॉलम जोड़ सकते हैं:

ALTER TABLE {tableName} ADD COLUMN COLNew {type};

दूसरा, और अधिक जटिल रूप से, लेकिन वास्तव में वह कॉलम जहां आप चाहते हैं, वह तालिका का नाम बदलना होगा:

ALTER TABLE {tableName} RENAME TO TempOldTable;

फिर लापता कॉलम के साथ नई तालिका बनाएं:

CREATE TABLE {tableName} (name TEXT, COLNew {type} DEFAULT {defaultValue}, qty INTEGER, rate REAL);

और पुराने डेटा के साथ इसे पॉप्युलेट करें:

INSERT INTO {tableName} (name, qty, rate) SELECT name, qty, rate FROM TempOldTable;

फिर पुरानी तालिका हटाएं:

DROP TABLE TempOldTable;

मैं दूसरा विकल्प ज्यादा पसंद करूंगा, क्योंकि यह आपको जरूरत पड़ने पर सब कुछ पूरी तरह से नाम बदलने की अनुमति देगा।


26
मैं पहले विकल्प के लिए जाऊंगा, और एकांत विकल्प से बाहर डिफ़ॉल्ट विकल्प का उपयोग कर सकता हूं- TABLE {tableName} ADD COLUMN COLNew {टाइप} DEFAULT {defaultValue}; अधिक महत्वपूर्ण: (इस बारे में सोचकर कि आप स्तंभों को क्रमबद्ध क्यों करना चाहते हैं ..) हर रिकॉर्ड क्रिया में उपयोग करें (जैसे सम्मिलित करें या जोड़ें) हमेशा स्तंभ नाम, इस तरह, आपको तालिका में फेरबदल करने के बाद अपने कोड में गलतियों को कभी नहीं मिलेगा।
michel.iamit

5
वैसे: कुछ
फ़ील्ड के

9
इंडेक्स बनाने के लिए मत भूलना
Jan Turo T

5
आपको ट्रिगर को भी फिर से बनाने की आवश्यकता होगी
क्रिस्टोफर के।

7
विदेशी कुंजियों के कारण संभावित बाधा उल्लंघन को न भूलें: "... लेकिन विदेशी प्रमुख कार्यों या बाधाओं का उल्लंघन हो सकता है।" (देखें sqlite.org/foreignkeys.html#fk_schemacommands ); वर्कअराउंड के रूप में आप इस बीच विदेशी कुंजियों को निष्क्रिय कर सकते हैं: PRAGMA foreign_keys = ON;( sqlite.org/foreignkeys.html#fk_enable देखें )
त्रिनिमोन

112

आप SQL में अन्य कॉलम के बीच कॉलम नहीं जोड़ते हैं , आप बस उन्हें जोड़ते हैं। जहां उन्हें लगाया जाता है वह पूरी तरह से डीबीएमएस है। यह सुनिश्चित करने के लिए सही जगह है कि कॉलम सही क्रम में बाहर आते हैं, जब आप selectउन्हें

दूसरे शब्दों में, यदि आप उन्हें क्रम में चाहते हैं {name,colnew,qty,rate}, तो आप उपयोग करते हैं:

select name, colnew, qty, rate from ...

SQLite के साथ, आपको उपयोग करने की आवश्यकता है alter table, एक उदाहरण:

alter table mytable add column colnew char(50)

2
SELECT * FROM mytable?
ईएमएल

यदि हम इसे नए कॉलम की मौजूदा पंक्तियों में निर्दिष्ट नहीं करते हैं तो डिफ़ॉल्ट मान क्या है?
याकूब

12
बहुत कम उपयोग के मामले हैं जहां आपको बिल्कुल करना चाहिए select *। यह उन कार्यक्रमों के लिए कभी-कभी काम करता है जो तालिकाओं की खोज करना चाहते हैं लेकिन, अधिकांश उपयोगों के लिए, आपको स्पष्ट रूप से निर्दिष्ट करना चाहिए कि आप क्या चाहते हैं और इसलिए वह क्रम जिसमें आप इसे चाहते हैं।
paxdiablo

4
यह पागल है कि यह "स्वीकृत उत्तर" कैसे नहीं है। मूल प्रश्न स्वयं यह समझने की पूरी कमी दर्शाता है कि RDBMS कैसे काम करता है।
वडा पोचे

12

आप क्वेरी के साथ नया कॉलम जोड़ सकते हैं

ALTER TABLE TableName ADD COLUMN COLNew CHAR(25)

लेकिन इसे अंत में जोड़ा जाएगा, मौजूदा कॉलम के बीच में नहीं।


11

SQLite में ALTER TABLE सपोर्ट सीमित है जिसका उपयोग आप टेबल के अंत में कॉलम जोड़ने के लिए या टेबल का नाम बदलने के लिए कर सकते हैं।

यदि आप किसी तालिका की संरचना में अधिक जटिल परिवर्तन करना चाहते हैं, तो आपको तालिका को फिर से बनाना होगा। आप मौजूदा डेटा को एक अस्थायी तालिका में सहेज सकते हैं, पुरानी तालिका को गिरा सकते हैं, नई तालिका बना सकते हैं, फिर अस्थायी तालिका से डेटा को वापस कॉपी कर सकते हैं।

उदाहरण के लिए, मान लें कि आपके पास "t1" नाम का एक स्तंभ है, जिसमें "a" और "c" नाम हैं और आप इस तालिका से कॉलम "b" सम्मिलित करना चाहते हैं। निम्नलिखित चरण यह बताते हैं कि यह कैसे किया जा सकता है:

BEGIN TRANSACTION;
CREATE TEMPORARY TABLE t1_backup(a,c);
INSERT INTO t1_backup SELECT a,c FROM t1;
DROP TABLE t1;
CREATE TABLE t1(a,b, c);
INSERT INTO t1 SELECT a,c FROM t1_backup;
DROP TABLE t1_backup;
COMMIT;

अब आप अपना नया डेटा डालने के लिए तैयार हैं:

UPDATE t1 SET b='blah' WHERE a='key'

मेरे परीक्षणों में, लाइन INSERT INTO t1 SELECT a,c FROM t1_backup;त्रुटि का कारण बनती है: "तालिका t1 में 3 कॉलम हैं लेकिन 2 मान दिए गए थे: INSERT INTO t1 a, c FROM t1_backup का चयन करें;"। सही लाइन होनी चाहिएINSERT INTO t1 (a,c) SELECT a,c FROM t1_backup;
JnLlnd

5
ALTER TABLE {tableName} ADD COLUMN COLNew {type};
UPDATE {tableName} SET COLNew = {base on {type} pass value here};

इस अद्यतन को आवश्यक मान के रूप में, एक डिफ़ॉल्ट मान इनपुट करते हुए अशक्त मान को संभालने के लिए आवश्यक है। जैसा कि आपके मामले में, आपको SELECTक्वेरी को कॉल करने की आवश्यकता है और आपको स्तंभों का क्रम मिलेगा, जैसा कि पहले से ही paxdiablo ने कहा था:

SELECT name, colnew, qty, rate FROM{tablename}

और मेरी राय में, कर्सर से मान प्राप्त करने के लिए आपका कॉलम नाम:

private static final String ColNew="ColNew";
String val=cursor.getString(cursor.getColumnIndex(ColNew));

इसलिए यदि सूचकांक आपके आवेदन को बदलता है तो किसी भी समस्या का सामना नहीं करना पड़ेगा।

यह इस अर्थ में सुरक्षित तरीका है कि अन्यथा, यदि आप उपयोग कर रहे हैं CREATE temptableया RENAME tableया तो CREATE, डेटा की हानि का एक उच्च मौका होगा यदि सावधानी से नहीं संभाला जाता है, उदाहरण के लिए उस मामले में जहां बैटरी लेनदेन के दौरान आपका लेनदेन होता है।


4

मैं उसी समस्या का सामना कर रहा था और स्वीकृत उत्तर में प्रस्तावित दूसरी विधि, जैसा कि टिप्पणियों में उल्लेख किया गया है, विदेशी कुंजी के साथ काम करते समय समस्याग्रस्त हो सकती है।

मेरा वर्कअराउंड डेटाबेस को एक sql फाइल में एक्सपोर्ट करना है जिससे यह सुनिश्चित हो सके कि INSERT स्टेटमेंट में कॉलम नाम शामिल हैं। मैं इसे SQLite के लिए DB ब्राउजर का उपयोग करता हूं जिसके लिए एक आसान सुविधा है। उसके बाद आपको सिर्फ टेबल टेबल स्टेटमेंट को एडिट करना होगा और नया कॉलम डालना होगा जहाँ आप इसे चाहते हैं और db को फिर से बनाएँ।

सिस्टम की तरह * निक्स में कुछ है

cat db.sql | sqlite3 database.db

मुझे नहीं पता कि यह बहुत बड़े डेटाबेस के साथ कितना संभव है, लेकिन इसने मेरे मामले में काम किया।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.