जवाबों:
आपके पास दो विकल्प हैं। सबसे पहले, आप बस निम्नलिखित के साथ एक नया कॉलम जोड़ सकते हैं:
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;
मैं दूसरा विकल्प ज्यादा पसंद करूंगा, क्योंकि यह आपको जरूरत पड़ने पर सब कुछ पूरी तरह से नाम बदलने की अनुमति देगा।
PRAGMA foreign_keys = ON;
( sqlite.org/foreignkeys.html#fk_enable देखें )
आप SQL में अन्य कॉलम के बीच कॉलम नहीं जोड़ते हैं , आप बस उन्हें जोड़ते हैं। जहां उन्हें लगाया जाता है वह पूरी तरह से डीबीएमएस है। यह सुनिश्चित करने के लिए सही जगह है कि कॉलम सही क्रम में बाहर आते हैं, जब आप select
उन्हें
दूसरे शब्दों में, यदि आप उन्हें क्रम में चाहते हैं {name,colnew,qty,rate}
, तो आप उपयोग करते हैं:
select name, colnew, qty, rate from ...
SQLite के साथ, आपको उपयोग करने की आवश्यकता है alter table
, एक उदाहरण:
alter table mytable add column colnew char(50)
SELECT * FROM mytable
?
select *
। यह उन कार्यक्रमों के लिए कभी-कभी काम करता है जो तालिकाओं की खोज करना चाहते हैं लेकिन, अधिकांश उपयोगों के लिए, आपको स्पष्ट रूप से निर्दिष्ट करना चाहिए कि आप क्या चाहते हैं और इसलिए वह क्रम जिसमें आप इसे चाहते हैं।
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;
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
, डेटा की हानि का एक उच्च मौका होगा यदि सावधानी से नहीं संभाला जाता है, उदाहरण के लिए उस मामले में जहां बैटरी लेनदेन के दौरान आपका लेनदेन होता है।
मैं उसी समस्या का सामना कर रहा था और स्वीकृत उत्तर में प्रस्तावित दूसरी विधि, जैसा कि टिप्पणियों में उल्लेख किया गया है, विदेशी कुंजी के साथ काम करते समय समस्याग्रस्त हो सकती है।
मेरा वर्कअराउंड डेटाबेस को एक sql फाइल में एक्सपोर्ट करना है जिससे यह सुनिश्चित हो सके कि INSERT स्टेटमेंट में कॉलम नाम शामिल हैं। मैं इसे SQLite के लिए DB ब्राउजर का उपयोग करता हूं जिसके लिए एक आसान सुविधा है। उसके बाद आपको सिर्फ टेबल टेबल स्टेटमेंट को एडिट करना होगा और नया कॉलम डालना होगा जहाँ आप इसे चाहते हैं और db को फिर से बनाएँ।
सिस्टम की तरह * निक्स में कुछ है
cat db.sql | sqlite3 database.db
मुझे नहीं पता कि यह बहुत बड़े डेटाबेस के साथ कितना संभव है, लेकिन इसने मेरे मामले में काम किया।