2011-11-24 23 views
33

मैं एक SQLite तालिका उत्पन्न (जावा में):SQLite autoincrement - मूल्यों को कैसे सम्मिलित करें?

java.sql.SQLException: table participants has 3 columns but 2 values were supplied 

मैं:

insert into participants values ("bla","blub"); 

मैं त्रुटि मिलती है:

create table participants (ROWID INTEGER PRIMARY KEY AUTOINCREMENT, col1,col2); 

बाद में मैं सम्मिलित करें comand का उपयोग कर पंक्तियों को जोड़ने का प्रयास सोचा कि पंक्ति आईडी स्वचालित रूप से जेनरेट की जाएगी, लेकिन ऐसा लगता है कि मुझे कुछ याद आती है।


मैं एक और समाधान की कोशिश की:

PreparedStatement prep = conn.prepareStatement("insert into participants values (?,?,?);"); 
Integer n = null; 
prep.setInt(1,n); 
prep.setString(2, "bla"); 
prep.setString(3, "blub"); 
prep.addBatch(); 
prep.executeBatch(); 

परिणाम के रूप में मैं पर एक नल पॉइंटर एक्सेप्शन प्राप्त "prep.setInt (1, n),"

क्या आपको गलती दिखाई देती है?

उत्तर

48

क्या आपने तालिका के किन क्षेत्रों को इंगित करने का प्रयास किया है, जिन्हें आप पारित कर रहे हैं?

INSERT INTO table_name (column1, column2, column3,...) 
VALUES (value1, value2, value3,...) 

आपके मामले में शायद कुछ की तरह:

INSERT INTO participants(col1, col2) VALUES ("bla","blub"); 
+0

मुझे लगता है कि यह काम करेगा, मुझे एक और अच्छा तरीका मिला और सवाल संपादित किया! धन्यवाद ! – Anthea

+1

यह सही तरीका है। यह SQLite के लिए भी विशिष्ट नहीं है। –

+0

यदि आप स्कीमा माइग्रेशन कर रहे हैं और अपने सम्मिलन के लिए एक चुनिंदा कथन का उपयोग कर रहे हैं तो आप प्रतिभागियों में शामिल हो सकते हैं (col1, col2) col1 का चयन करें, col1 t1_backup से col2; ' – mlissner

7

एक काम कर समाधान here पाया:

PreparedStatement prep = conn.prepareStatement("insert into participants values ($next_id,?,?);"); 
prep.setString(2, "bla"); 
prep.setString(3, "blub"); 
1

अपने त्रुटि के कारण यह है कि एसक्यूएल इंसर्ट आप एक ही नंबर प्रदान करने की उम्मीद है मानों के रूप में जब कॉलम विनिर्देशक का उपयोग नहीं किया जाता है तो तालिका में कॉलम होते हैं।

अर्थात जब आप इस तरह एक SQL क्वेरी लिखें:

INSERT INTO TableName VALUES(a1,a2, ...) 

.. मूल्यों तालिका परिभाषा (और यह भी एक ही राशि) के रूप में ठीक उसी क्रम में होना है। इसका कारण अस्पष्टता से बचने और त्रुटियों की संख्या को कम करना है।

आपके मामले में आपके पास एक ऑटो वृद्धि कॉलम है जिसके लिए आप कोई मान निर्दिष्ट नहीं करना चाहते हैं। यही कारण है कि निश्चित रूप से संभव है, लेकिन नियमों का पालन ऊपर आप स्तंभ नाम निर्दिष्ट करना होगा:

INSERT INTO TableName (columnName1, columnName2) VALUES(Value1, Value2); 
11

स्तंभ नाम का उपयोग कर autoincreament के स्थान पर using null हो जाएगा बिना सबसे आसान तरीका यह

insert into table values (null, col1, col2) 

अगर की तरह है आप पहले कॉलम को ऑटोइनक्रिकमेंट के रूप में सेट कर चुके हैं, यह ठीक काम करेगा।

संबंधित मुद्दे