क्या एक SQLite डेटाबेस में एक बार में कई पंक्तियों को सम्मिलित करना संभव है?


551

MySQL में आप इस तरह कई पंक्तियाँ सम्मिलित कर सकते हैं:

INSERT INTO 'tablename' ('column1', 'column2') VALUES
    ('data1', 'data2'),
    ('data1', 'data2'),
    ('data1', 'data2'),
    ('data1', 'data2');

हालाँकि, मुझे कुछ ऐसा करने का प्रयास करने पर त्रुटि हो रही है। क्या एक SQLite डेटाबेस में एक बार में कई पंक्तियों को सम्मिलित करना संभव है? ऐसा करने के लिए वाक्यविन्यास क्या है?


26
कोई संदेह नहीं है, क्योंकि यह प्रश्न विशेष रूप से SQLite के बारे में पूछ रहा है, क्योंकि सामान्य रूप से SQL के विपरीत (हालांकि उस प्रश्न के कुछ उत्तर इस के लिए सहायक हैं)।
ब्रायन कैंपबेल

5
थोक आवेषण पर: stackoverflow.com/questions/1711631/…
tuinstoel

5
सवाल यह है कि आपको ऐसा क्यों करना चाहिए। जैसा कि SQlite एक ही मशीन पर इन-प्रोसेस है और आप एक लेन-देन में कई आवेषण लपेट सकते हैं, जिसकी मुझे आवश्यकता नहीं है?
औरिग जूल

2
हां, संस्करण 2012-03-20 (3.7.11) से प्रारंभ करें, आपका सिंटैक्स समर्थित है।
mjb

जवाबों:


607

अपडेट करें

जैसा कि ब्रायनकैंपबेल बताते हैं , SQLite 3.7.11 और इसके बाद के संस्करण मूल पोस्ट के सरल सिंटैक्स का समर्थन करते हैं । हालाँकि, यदि आप लीगेसी डेटाबेस में अधिकतम संगतता चाहते हैं, तो दिखाया गया दृष्टिकोण अभी भी उपयुक्त है।

मूल उत्तर

यदि मेरे पास विशेषाधिकार होते, तो मैं नदी के उत्तर को टक्कर देता : आप SQLite में कई पंक्तियाँ डाल सकते हैं , आपको बस अलग वाक्यविन्यास की आवश्यकता होती है । इसे पूरी तरह से स्पष्ट करने के लिए, ओपीएस MySQL उदाहरण:

INSERT INTO 'tablename' ('column1', 'column2') VALUES
  ('data1', 'data2'),
  ('data1', 'data2'),
  ('data1', 'data2'),
  ('data1', 'data2');

इसे पुन: SQLite में बदला जा सकता है:

     INSERT INTO 'tablename'
          SELECT 'data1' AS 'column1', 'data2' AS 'column2'
UNION ALL SELECT 'data1', 'data2'
UNION ALL SELECT 'data1', 'data2'
UNION ALL SELECT 'data1', 'data2'

प्रदर्शन पर एक नोट

मैंने मूल रूप से रूबी ऑन रेल्स से बड़े डेटासेट को कुशलतापूर्वक लोड करने के लिए इस तकनीक का उपयोग किया था। हालांकि , जैसा कि जैम कुक बताते हैं , यह स्पष्ट नहीं है कि यह किसी INSERTsएकल लेनदेन के भीतर किसी व्यक्ति को तेजी से लपेट रहा है :

BEGIN TRANSACTION;
INSERT INTO 'tablename' table VALUES ('data1', 'data2');
INSERT INTO 'tablename' table VALUES ('data3', 'data4');
...
COMMIT;

यदि दक्षता आपका लक्ष्य है, तो आपको पहले यह प्रयास करना चाहिए।

UNION बनाम UNION ALL पर एक नोट

जैसा कि कई लोगों ने टिप्पणी की, यदि आप उपयोग करते हैं UNION ALL(जैसा कि ऊपर दिखाया गया है), सभी पंक्तियों को डाला जाएगा, इसलिए इस मामले में, आपको चार पंक्तियाँ मिलेंगी data1, data2। यदि आप छोड़ देते हैं ALL, तो डुप्लिकेट पंक्तियों को समाप्त कर दिया जाएगा (और ऑपरेशन संभवतः थोड़ा धीमा होगा)। हम UNION ALL का उपयोग कर रहे हैं क्योंकि यह मूल पोस्ट के शब्दार्थ से अधिक निकटता से मेल खाता है।

बंद होने को

पुनश्च: कृपया +1 नदी का उत्तर दें , क्योंकि इसने पहले समाधान प्रस्तुत किया था।


102
एक और नोट के रूप में, sqlite केवल 500 तक ऐसे संघ चयनों का समर्थन करता है, जो यदि आप अधिक डेटा में फेंकने की कोशिश कर रहे हैं, तो इससे आपको 500 तत्व ब्लॉकों ( sqlite.org/limits.html ) में इसे तोड़ने की आवश्यकता होगी
जेमी कुक

3
सहमत: SQLite अड़चन नहीं है, यह व्यक्तिगत ORM लेनदेन का ओवरहेड है (मेरे मामले में, रूबी ऑन रेल्स)। इसलिए यह अभी भी एक बड़ी जीत है।
निर्भय_फूल

3
लेन-देन ब्लॉकों का उपयोग करने के लिए यह समाधान या 3.7.11 समाधान कैसे करता है? यह तेजी से है insert into t values (data),(data),(data)या begin transaction; insert into t values (data);insert into t values (data);insert into t values (data);Commit;?
दान

5
एक और नोट के रूप में: सावधान! यह वाक्य रचना डुप्लिकेट पंक्तियाँ निकालता है! UNION ALL(या कुछ मामूली प्रदर्शन लाभ के लिए) से बचने के लिए उपयोग करें।
chacham15

1
SQLite संस्करण की जाँच करने के लिए @Shadowax, sqlite3.sqlite_version(यह 3.7.x या 3.8.x होना चाहिए) देखें, न कि sqlite3.version(जो कि अजगर मॉड्यूल का सिर्फ संस्करण है)।
अधिकतम

562

हां यह संभव है, लेकिन सामान्य अल्पविराम द्वारा अलग किए गए मानों के साथ नहीं।

इसे इस्तेमाल करे...

insert into myTable (col1,col2) 
     select aValue as col1,anotherValue as col2 
     union select moreValue,evenMoreValue 
     union...

हां, यह मानों के एक सेट से बयान की पीढ़ी को स्वचालित करने के लिए थोड़ा बदसूरत लेकिन काफी आसान है। इसके अलावा, ऐसा लगता है कि आपको केवल पहले चयन में कॉलम के नामों की घोषणा करने की आवश्यकता है।


36
कृपया उपयोग UNION ALLन करें UNION। सिवाय यदि आप डुप्लिकेट को निकालना चाहते हैं।
बेनोइट

4
यदि आप ऑटो-इंक्रीमेंट के लिए आईडी चाहते हैं, तो उन्हें NULL मान दें।
लीनो सेप

241

हाँ, SQLite 3.7.11 के रूप में यह SQLite में समर्थित है। से SQLite प्रलेखन :

SQLite INSERT स्टेटमेंट सिंटैक्स

(जब यह जवाब मूल रूप से लिखा गया था, यह समर्थित नहीं था)

SQLite के पुराने संस्करणों के साथ संगतता के लिए, आप चाल ने सुझाव दिया उपयोग कर सकते हैं एंडी और fearless_fool का उपयोग कर UNION, लेकिन 3.7.11 और बाद में सरल वाक्य रचना यहाँ में वर्णित प्राथमिकता दी जानी चाहिए के लिए।


3
मैं कहूंगा कि आरेख कई पंक्तियों की अनुमति देता है, क्योंकि कोष्ठक के बाहर अल्पविराम के साथ एक बंद लूप होता है VALUES
जोहान्स गेरेर 22:12

@JohannesGerer जब से मैंने इसे एम्बेड किया है, उन्होंने इस छवि को अपडेट किया है। आप उस समय आरेख को देख सकते हैं जब मैंने इसे इंटरनेट आर्काइव पर एम्बेड किया था । वास्तव में, यह सिर्फ दो महीने पहले था कि उन्होंने एक सम्मिलित में कई पंक्तियों के लिए समर्थन जोड़ा, और सिर्फ दो दिन पहले उन्होंने उस परिवर्तन के साथ एक संस्करण जारी किया। मैं उसी हिसाब से अपना जवाब अपडेट करूंगा।
ब्रायन कैंपबेल

1
@Brian, आप SQLite प्रलेखन पाठ का हवाला देते कराएं, तो यह है कि कहा गया है कि इस IS संभव? मैं 3 बार डॉक्स सम्मिलित करता हूं और कई पंक्तियों को सम्मिलित करने के बारे में कुछ नहीं मिला, लेकिन केवल यह तस्वीर (और कॉमा के बारे में कुछ भी नहीं VALUES (...), (...)) :(
Prizoff

1
@Prizoff मैं उस कमेटी से जुड़ा जिसमें यह समर्थन जोड़ा गया था , जिसमें परीक्षण के मामले भी शामिल थे। आप आरेख में देख सकते हैं ( IA लिंक की तुलना करें ), इसके बाद अभिव्यक्ति के चारों ओर एक लूप है VALUES, यह दर्शाता है कि इसे कॉमा द्वारा दोहराया जा सकता है। और मैं फीचर को जोड़ने वाले संस्करण के लिए रिलीज़ नोट्स से जुड़ा था , जो बताता है कि "INSERT सिंटैक्स को बढ़ाएं ताकि कई पंक्तियों को VALUES क्लॉज़ के माध्यम से डाला जा सके।"
ब्रायन कैंपबेल

1
@Prizoff मैंने SQLite मेंटेनर के लिए इसका उल्लेख किया, उन्होंने एक सुधार किया है जो ड्राफ्ट प्रलेखन में उपलब्ध है । मैं अनुमान लगा रहा हूं कि यह अगले रिलीज के रूप में आधिकारिक दस्तावेज में होगा।
ब्रायन कैंपबेल

57

मैंने सम्मिलित विवरणों की एक श्रृंखला से एकल 500 तत्व बहु-पंक्ति सम्मिलित उत्पन्न करने के लिए कुछ रूबी कोड लिखे जो व्यक्तिगत आवेषण चलाने की तुलना में काफी तेज थे। फिर मैंने बस एक ही लेन-देन में कई आवेषण को लपेटने की कोशिश की और पाया कि मुझे उसी तरह की गति मिल सकती है जिसमें काफी कम कोड हो।

BEGIN TRANSACTION;
INSERT INTO table VALUES (1,1,1,1);
INSERT INTO table VALUES (2,2,2,2);
...
COMMIT;

1
लेकिन यह कोड में काम नहीं करता था, जबकि यह सीधे SQLite प्रबंधक में काम कर रहा है। कोड में यह केवल पहली पंक्ति सम्मिलित करता है :(
वैभव सरन

4
मैं अपने कोड में डालने की इस शैली का उपयोग कर रहा हूं और यह पूरी तरह से काम करता है। आपको केवल यह सुनिश्चित करना होगा कि आप एक बार में सभी एसक्यूएल जमा कर दें। यह मेरे लिए एक बड़ी गति वृद्धि थी लेकिन मुझे इस बात की उत्सुकता है कि यदि स्वीकृत उत्तर तेज या धीमा है तो यह?
डैन

यह दृष्टिकोण एक एकल लेनदेन के भीतर कई तालिकाओं को संशोधित करते समय वास्तव में अच्छी तरह से मापता है, जो मुझे लगता है कि जब डेटाबेस लोड हो रहा है तो मैं अक्सर ऐसा करता हूं।
फ्रैंक

ध्यान दें कि यदि बाइंडिंग का उपयोग करने की आवश्यकता है तो यह दृष्टिकोण काम नहीं करेगा । SQLite3 इंजन यह मान लेगा कि आपके सभी बाइंडिंग पहले बयान पर लागू किए जाने हैं, और निम्नलिखित कथनों को अनदेखा करें। अधिक विवरण के लिए इस SO प्रश्न को देखें ।
फिलिप हेबर्ट

38

इस पृष्ठ के अनुसार यह समर्थित नहीं है:

  • 2007-12-03: बहु-पंक्ति INSERT उर्फ ​​कंपाउंड INSERT समर्थित नहीं।
  INSERT INTO table (col1, col2) VALUES 
      ('row1col1', 'row1col2'), ('row2col1', 'row2col2'), ...

दरअसल, SQL92 मानक के अनुसार, एक VALUES अभिव्यक्ति को स्वयं पर खड़े होने में सक्षम होना चाहिए। उदाहरण के लिए, निम्नलिखित को तीन पंक्तियों वाली एक-स्तंभ तालिका वापस करनी चाहिए:VALUES 'john', 'mary', 'paul';

संस्करण के रूप में 3.7.11 SQLite बहु-पंक्ति-सम्मिलित का समर्थन करता है । रिचर्ड हिप्प टिप्पणी:

"नई बहु-मूल्यवान प्रविष्टि केवल यौगिक सम्मिलित करने के लिए सिंटैक्टिक सार्जर (सिक) है। कोई प्रदर्शन लाभ एक या दूसरे का नहीं है।"


एक या दूसरे तरीके से कोई प्रदर्शन लाभ नहीं है। - क्या आप मुझे बता सकते हैं कि आपने वह टिप्पणी कहाँ देखी थी? मुझे यह कहीं नहीं मिला।
एलिक्स एक्सल

15

संस्करण 2012-03-20 (3.7.11) से प्रारंभ करें, निम्नलिखित INSERT सिंटैक्स में sqlite का समर्थन करता है:

INSERT INTO 'tablename' ('column1', 'column2') VALUES
  ('data1', 'data2'),
  ('data3', 'data4'),
  ('data5', 'data6'),
  ('data7', 'data8');

प्रलेखन पढ़ें: http://www.sqlite.org/lang_insert.html

पुनश्च: ब्रायन कैंपबेल के उत्तर / उत्तर के लिए कृपया +1 करें। मेरा नहीं है! उन्होंने सबसे पहले समाधान प्रस्तुत किया।


10

जैसा कि अन्य पोस्टरों ने कहा है, SQLite इस सिंटैक्स का समर्थन नहीं करता है। मुझे पता नहीं है कि यौगिक INSERTs SQL मानक का हिस्सा हैं, लेकिन मेरे अनुभव में वे कई उत्पादों में लागू नहीं हैं।

एक तरफ के रूप में, आपको पता होना चाहिए कि यदि आप एक स्पष्ट लेनदेन में कई INSERT लपेटते हैं, तो SQLite में INSERT प्रदर्शन में काफी सुधार होता है।


10

हां, sql यह कर सकता है, लेकिन एक अलग वाक्यविन्यास के साथ। जिस तरह से sqlite प्रलेखन बहुत अच्छा है। यह आपको यह भी बताएगा कि कई पंक्ति सम्मिलित करने का एकमात्र तरीका डेटा के स्रोत के रूप में चयनित कथन का उपयोग करना है।


9

Sqlite3 एक चयन के माध्यम से SQL में सीधे ऐसा नहीं कर सकता है, और जबकि SELECT "पंक्ति" के भावों को वापस कर सकता है, मुझे यह पता नहीं है कि इसे बनाने के लिए कोई तरीका है।

हालांकि, सीएलआई यह कर सकता है:

.import FILE TABLE     Import data from FILE into TABLE
.separator STRING      Change separator used by output mode and .import

$ sqlite3 /tmp/test.db
SQLite version 3.5.9
Enter ".help" for instructions
sqlite> create table abc (a);
sqlite> .import /dev/tty abc
1
2
3
99
^D
sqlite> select * from abc;
1
2
3
99
sqlite> 

यदि आप CLI .importकमांड का उपयोग करने के बजाय एक INSERT के चारों ओर एक लूप लगाते हैं , तो INSERT गति के लिए sqlite FAQ में सलाह का पालन करना सुनिश्चित करें:

डिफ़ॉल्ट रूप से, प्रत्येक INSERT कथन का अपना लेनदेन है। लेकिन अगर आप BEGIN ... COMMIT के साथ कई INSERT स्टेटमेंट को घेरते हैं, तो सभी आवेषणों को एक ही लेनदेन में वर्गीकृत किया जाता है। लेन-देन करने के लिए आवश्यक समय सभी संलग्न विवरणों पर परिशोधित होता है और इसलिए प्रति स्टेटमेंट डालने का समय बहुत कम हो जाता है।

एक अन्य विकल्प PRAGMA सिंक्रोनस = ऑफ चलाना है। यह कमांड SQLite को डिस्क की सतह तक पहुंचने के लिए डेटा पर इंतजार नहीं करने का कारण बनेगी, जो लिखता है ऑपरेशन बहुत तेज दिखाई देंगे। लेकिन अगर आप लेन-देन के बीच में शक्ति खो देते हैं, तो आपकी डेटाबेस फ़ाइल दूषित हो सकती है।


यदि आप SQLite के .importकमांड कोड के स्रोत को देखते हैं , तो यह सिर्फ एक लूप है, इनपुट फ़ाइल (या ट्टी) से एक लाइन को पढ़ना और फिर उस लाइन के लिए एक INSERT स्टेटमेंट। दुर्भाग्य से दक्षता में उल्लेखनीय सुधार नहीं हुआ।
बिल कार्विन

8

एलेक्स सही है: "सेलेक्ट ... यूनियन" स्टेटमेंट ऑर्डर को खो देगा जो कुछ उपयोगकर्ताओं के लिए बहुत महत्वपूर्ण है। यहां तक ​​कि जब आप किसी विशिष्ट क्रम में सम्मिलित करते हैं, तब भी साइक्लाइट चीजों को बदल देता है, इसलिए लेनदेन का उपयोग करना पसंद करते हैं यदि डालने का आदेश महत्वपूर्ण है।

create table t_example (qid int not null, primary key (qid));
begin transaction;
insert into "t_example" (qid) values (8);
insert into "t_example" (qid) values (4);
insert into "t_example" (qid) values (9);
end transaction;    

select rowid,* from t_example;
1|8
2|4
3|9

8

भयमुक्त_फूल पुराने संस्करणों के लिए एक महान जवाब है। मैं सिर्फ यह जोड़ना चाहता हूं कि आपको यह सुनिश्चित करने की आवश्यकता है कि आपके पास सभी कॉलम सूचीबद्ध हैं। इसलिए यदि आपके पास 3 कॉलम हैं, तो आपको 3 कॉलम पर चुनिंदा कार्य करने की आवश्यकता है।

उदाहरण: मेरे पास 3 कॉलम हैं लेकिन मैं केवल 2 कॉलम डेटा डालना चाहता हूं। मान लें कि मुझे पहले कॉलम की परवाह नहीं है क्योंकि यह एक मानक पूर्णांक आईडी है। मैं निम्नलिखित कर सकता है ...

INSERT INTO 'tablename'
      SELECT NULL AS 'column1', 'data1' AS 'column2', 'data2' AS 'column3'
UNION SELECT NULL, 'data3', 'data4'
UNION SELECT NULL, 'data5', 'data6'
UNION SELECT NULL, 'data7', 'data8'

नोट: याद रखें "select ... Union" स्टेटमेंट ऑर्डर को खो देगा। (AG1 से)


7
INSERT INTO TABLE_NAME 
            (DATA1, 
             DATA2) 
VALUES      (VAL1, 
             VAL2), 
            (VAL1, 
             VAL2), 
            (VAL1, 
             VAL2), 
            (VAL1, 
             VAL2), 
            (VAL1, 
             VAL2), 
            (VAL1, 
             VAL2), 
            (VAL1, 
             VAL2), 
            (VAL1, 
             VAL2); 

6

आप नहीं कर सकते, लेकिन मुझे नहीं लगता कि आप कुछ भी याद करते हैं।

चूँकि आप हमेशा प्रक्रिया में साइक्लाईट कहते हैं, इसलिए यह प्रदर्शन में लगभग कोई फर्क नहीं पड़ता है कि आप 1 इंसर्ट स्टेटमेंट या 100 इंसर्ट स्टेटमेंट निष्पादित करते हैं। हालाँकि कमिट में बहुत समय लगता है इसलिए उन 100 आवेषणों को लेन-देन के अंदर रखें।

Sqlite बहुत तेज़ है जब आप पैरामीटरेटेड क्वेश्चन का उपयोग करते हैं (बहुत कम पार्सिंग की आवश्यकता होती है) तो मैं इस तरह से बड़े कॉनसेनेट नहीं कर सकता:

insert into mytable (col1, col2)
select 'a','b'
union 
select 'c','d'
union ...

उन्हें बार-बार पार्स करने की आवश्यकता है क्योंकि प्रत्येक संक्षिप्त बयान अलग है।


6

mysql लाइट में आप कई मान नहीं डाल सकते हैं, लेकिन आप केवल एक बार कनेक्शन खोलकर और फिर सभी प्रविष्टि कर और फिर कनेक्शन बंद करके समय बचा सकते हैं। इससे समय की काफी बचत होती है


5

लेन-देन का उपयोग करने में समस्या यह है कि आप पढ़ने के लिए भी तालिका को लॉक करते हैं। इसलिए यदि आपके पास सम्मिलित करने के लिए वास्तव में बहुत अधिक डेटा है और आपको अपने डेटा तक पहुंचने की आवश्यकता है, तो पूर्वावलोकन के लिए या तो, इस तरह से यह अच्छी तरह से काम नहीं करता है।

अन्य समाधान के साथ समस्या यह है कि आप डालने का क्रम खो देते हैं

insert into mytable (col)
select 'c'
union 
select 'd'
union 
select 'a'
union 
select 'b';

Sqlite में डेटा स्टोर किया जाएगा a, b, c, d ...


5

संस्करण के रूप में 3.7.11 SQLite बहु-पंक्ति-सम्मिलित का समर्थन करता है। रिचर्ड हिप्प टिप्पणी:

मैं 3.6.13 का उपयोग कर रहा हूं

मैं इस तरह से आदेश देता हूं:

insert into xtable(f1,f2,f3) select v1 as f1, v2 as f2, v3 as f3 
union select nextV1+, nextV2+, nextV3+

एक बार में 50 रिकॉर्ड डालने के बाद, यह केवल एक सेकंड या उससे कम समय लेता है।

एक समय में कई पंक्तियों को सम्मिलित करने के लिए sqlite का उपयोग करना सही है यह बहुत संभव है। @Andy ने लिखा।

धन्यवाद एंडी १



2

यदि आप Sqlite प्रबंधक फ़ायरफ़ॉक्स प्लगइन का उपयोग करते हैं , तो यह INSERTSQL स्टेटमेंट से थोक आवेषण का समर्थन करता है ।

वास्तव में यह इसका समर्थन नहीं करता है, लेकिन Sqlite ब्राउज़र करता है (विंडोज, ओएस एक्स, लिनक्स पर काम करता है)


2

मेरे पास नीचे की तरह एक क्वेरी है, लेकिन ODBC ड्राइवर के साथ SQLite के साथ एक त्रुटि है "," यह कहता है। मैं HTA (Html ​​Application) में vbscript चलाता हूं।

INSERT INTO evrak_ilac_iliskileri (evrak_id, ilac_id, baglayan_kullanici_id, tarih) VALUES (4150,762,1,datetime()),(4150,9770,1,datetime()),(4150,6609,1,datetime()),(4150,3628,1,datetime()),(4150,9422,1,datetime())

2

Sqlite पर 3.7.2:

INSERT INTO table_name (column1, column2) 
                SELECT 'value1', 'value1' 
          UNION SELECT 'value2', 'value2' 
          UNION SELECT 'value3', 'value3' 

और इसी तरह


2

मैं क्वेरी को गतिशील बनाने में सक्षम हूं। यह मेरी तालिका है:

CREATE TABLE "tblPlanner" ("probid" text,"userid" TEXT,"selectedtime" DATETIME,"plannerid" TEXT,"isLocal" BOOL,"applicationid" TEXT, "comment" TEXT, "subject" TEXT)

और मैं एक के माध्यम से सभी डेटा प्राप्त कर रहा हूं JSON, इसलिए NSArrayमेरे अंदर सब कुछ प्राप्त करने के बाद :

    NSMutableString *query = [[NSMutableString alloc]init];
    for (int i = 0; i < arr.count; i++)
    {
        NSString *sqlQuery = nil;
        sqlQuery = [NSString stringWithFormat:@" ('%@', '%@', '%@', '%@', '%@', '%@', '%@', '%@'),",
                    [[arr objectAtIndex:i] objectForKey:@"plannerid"],
                    [[arr objectAtIndex:i] objectForKey:@"probid"],
                    [[arr objectAtIndex:i] objectForKey:@"userid"],
                    [[arr objectAtIndex:i] objectForKey:@"selectedtime"],
                    [[arr objectAtIndex:i] objectForKey:@"isLocal"],
                    [[arr objectAtIndex:i] objectForKey:@"subject"],
                    [[arr objectAtIndex:i] objectForKey:@"comment"],
                    [[NSUserDefaults standardUserDefaults] objectForKey:@"applicationid"]
                    ];
        [query appendString:sqlQuery];
    }
    // REMOVING LAST COMMA NOW
    [query deleteCharactersInRange:NSMakeRange([query length]-1, 1)];

    query = [NSString stringWithFormat:@"insert into tblPlanner (plannerid, probid, userid, selectedtime, isLocal, applicationid, subject, comment) values%@",query];

और अंत में आउटपुट क्वेरी यह है:

insert into tblPlanner (plannerid, probid, userid, selectedtime, isLocal, applicationid, subject, comment) values 
<append 1>
('pl1176428260', '', 'US32552', '2013-06-08 12:00:44 +0000', '0', 'subj', 'Hiss', 'ap19788'),
<append 2>
('pl2050411638', '', 'US32552', '2013-05-20 10:45:55 +0000', '0', 'TERI', 'Yahoooooooooo', 'ap19788'), 
<append 3>
('pl1828600651', '', 'US32552', '2013-05-21 11:33:33 +0000', '0', 'test', 'Yest', 'ap19788'),
<append 4>
('pl549085534', '', 'US32552', '2013-05-19 11:45:04 +0000', '0', 'subj', 'Comment', 'ap19788'), 
<append 5>
('pl665538927', '', 'US32552', '2013-05-29 11:45:41 +0000', '0', 'subj', '1234567890', 'ap19788'), 
<append 6>
('pl1969438050', '', 'US32552', '2013-06-01 12:00:18 +0000', '0', 'subj', 'Cmt', 'ap19788'),
<append 7>
('pl672204050', '', 'US55240280', '2013-05-23 12:15:58 +0000', '0', 'aassdd', 'Cmt', 'ap19788'), 
<append 8>
('pl1019026150', '', 'US32552', '2013-06-08 12:15:54 +0000', '0', 'exists', 'Cmt', 'ap19788'), 
<append 9>
('pl790670523', '', 'US55240280', '2013-05-26 12:30:21 +0000', '0', 'qwerty', 'Cmt', 'ap19788')

जो कोड के माध्यम से भी अच्छी तरह से चल रहा है और मैं सफलतापूर्वक SQLite में सब कुछ बचाने में सक्षम हूं।

इससे पहले मैंने UNIONक्वेरी सामान को गतिशील बना दिया था, लेकिन कुछ सिंटैक्स त्रुटि देने लगा। वैसे भी, यह मेरे लिए अच्छा चल रहा है।


2

मुझे आश्चर्य है कि किसी ने भी तैयार बयानों का उल्लेख नहीं किया है । जब तक आप एसक्यूएल का उपयोग स्वयं नहीं कर रहे हैं और किसी अन्य भाषा के भीतर नहीं है, तब तक मुझे लगता है कि लेनदेन में लिपटे हुए तैयार बयान कई पंक्तियों को सम्मिलित करने का सबसे कुशल तरीका होगा।


1
तैयार बयान हमेशा एक अच्छा विचार होता है, लेकिन ओपी पूछ रहे सवाल से संबंधित नहीं है। वह पूछ रहा है कि एक बयान में कई डेटा डालने के लिए मूल सिंटैक्स क्या है।
लेकि

0

आप इन्सर्ट हेल्पर का उपयोग कर सकते हैं, यह आसान और तेज़ है

प्रलेखन: http://developer.android.com/reference/android/database/DatabaseUtils.InsertHelin.html

ट्यूटोरियल: http://www.outofwhatbox.com/blog/2010/12/android-using-databaseutils-inserthelper-for-faster-insertions-into-sqlite-database/

Edit: InsertHelper को API Level 17 के रूप में दर्शाया गया है


3
InsertHelper को एपीआई 17
ग्रेग्म

-1

यदि आप बैश शेल का उपयोग कर रहे हैं, तो आप इसका उपयोग कर सकते हैं:

time bash -c $'
FILE=/dev/shm/test.db
sqlite3 $FILE "create table if not exists tab(id int);"
sqlite3 $FILE "insert into tab values (1),(2)"
for i in 1 2 3 4; do sqlite3 $FILE "INSERT INTO tab (id) select (a.id+b.id+c.id)*abs(random()%1e7) from tab a, tab b, tab c limit 5e5"; done; 
sqlite3 $FILE "select count(*) from tab;"'

या यदि आप sqlite CLI में हैं, तो आपको यह करने की आवश्यकता है:

create table if not exists tab(id int);"
insert into tab values (1),(2);
INSERT INTO tab (id) select (a.id+b.id+c.id)*abs(random()%1e7) from tab a, tab b, tab c limit 5e5;
INSERT INTO tab (id) select (a.id+b.id+c.id)*abs(random()%1e7) from tab a, tab b, tab c limit 5e5;
INSERT INTO tab (id) select (a.id+b.id+c.id)*abs(random()%1e7) from tab a, tab b, tab c limit 5e5;
INSERT INTO tab (id) select (a.id+b.id+c.id)*abs(random()%1e7) from tab a, tab b, tab c limit 5e5;
select count(*) from tab;

यह कैसे काम करता है? यह तालिका का उपयोग करता है tab:

id int
------
1
2

फिर select a.id, b.id from tab a, tab bलौटता है

a.id int | b.id int
------------------
    1    | 1
    2    | 1
    1    | 2
    2    | 2

और इसी तरह। पहले निष्पादन के बाद हम 2 पंक्तियों को सम्मिलित करते हैं, फिर 2 ^ 3 = 8। (तीन क्योंकि हमारे पास है tab a, tab b, tab c)

दूसरे निष्पादन के बाद हम अतिरिक्त डालें (2+8)^3=1000 पंक्तियों को हैं

Aftern थ्रिड हम सम्मिलित करते हैं max(1000^3, 5e5)=500000 पंक्तियों और इतने पर हैं ...

यह सबसे तेजी से SQLite डेटाबेस को आबाद करने की विधि के लिए जाना जाता है।


2
यदि आप उपयोगी डेटा सम्मिलित करना चाहते हैं तो यह काम नहीं करता है ।
सीएल।

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