2013-08-26 3 views
11

मेरे पास 80000 रिकोड हैं जिन्हें डेटाबेस में विशेष रूप से तालिका में डालने की आवश्यकता है: temp (ts, temp) temp INT है।mysql में विशेष रूप से INT डेटा टाइप करने के लिए विशेष रूप से INT डेटा टाइप

समस्या लगभग 20000 recodes अशक्त हो रहा है, तो मैं डीबी में शून्य सम्मिलित करने के लिए कैसे जब डेटाप्रकार INT है सोच रहा हूँ।

मैंने कोशिश की यह:

String val = null; 

//insert(ts, val) into temp 
String sql = "INSERT INTO temp" + "(val)" + " VALUES" + "('" + val + "')"; 
Statement st = (Statement) conn.createStatement(); 
count = st.executeUpdate(sql); 

दुर्भाग्य से सम्मिलित विफलता है। अपवाद संदेश मुद्रित करें:

Incorrect integer value: 'null' for column 'val' at row 1" 

इच्छा है कि कोई मेरी मदद कर सके। धन्यवाद।

+2

उद्धरण हटाएं? –

+0

इसे संपादित करें। धन्यवाद – Eric

उत्तर

13

आप एक PreparedStatement का उपयोग करें और setNull(int, int) उपयोग करना चाहिए:

String sql = "INSERT INTO temp(val) VALUES (?)"; 
PreparedStatement st = con.prepareStatement(sql); 
if (/* int value is not null */) { 
    st.setInt(1, value); 
} else { 
    set.setNull(1, Types.INTEGER); 
} 
count = st.executeUpdate(); 
+1

बहुत बहुत धन्यवाद। इससे पहले कि आपने मुझे प्रीपेर्डस्टेटमेंट बताया, मुझे यह नहीं पता था। यह मेरे प्रश्न का उत्तर है। एपीआई से: शून्य setNull (पूर्णांक parameterIndex, पूर्णांक sqlType) फेंकता SQLException: एसक्यूएल शून्य करने के लिए निर्दिष्ट पैरामीटर तय करता है। – Eric

0

आप चाहिए स्पष्ट रूप से CAST एक INT

...VALUES(...CAST(NULL AS INT)

0

ऐसा लगता है अपने जब आप एक पूर्णांक भेजने किया जाना चाहिए में भेज रहे हैं की तरह "शून्य" के रूप में शून्य। आप तैयार बयान का उपयोग कर विचार करना चाहिए

1

: (वैल? वैल == अशक्त "") शायद की तरह

कुछ प्रयास करें। यदि आप करते हैं, आप कैसे nulls here और दूसरी जगहों से निपटने के लिए के बारे में जानकारी मिल जाएगा।

आप 100% सुनिश्चित करें कि आपके val मूल्य साफ है और SQL इंजेक्शन का कारण नहीं बनेगा (दुर्लभ है, लेकिन संभव है), तो "बनाया स्ट्रिंग" दृष्टिकोण जब मूल्य को परिभाषित स्पष्ट null उपयोग करने की आवश्यकता कर रहे हैं:

String sql = "INSERT INTO temp (val) VALUES ("; 
if (val == null) { 
    sql += "null"; 
} else { 
    sql += val; 
} 
sql += ")"; 
+0

धन्यवाद, तुम सही हो। मैं गलत रास्ता जाता हूं। यदि मान रिक्त है, तो इसका मतलब रिकॉर्ड रिक्त है, तो यह और भी टाइमस्टैम्प है। तो मुझे उन रिकॉर्ड को रखने की ज़रूरत है जो शून्य नहीं हैं। – Eric

0

मैं इस समस्या का समाधान है। निम्नलिखित के रूप में कोड अद्यतन:

String sql= null; 
if(val.isEmpty()){ 
System.out.println(val); 
System.out.println("Insert ts: " + ts + " val: null"); 
sql= "INSERT INTO " + table + "(ts,val,pointId)" + " VALUES" + "(" + "'" + ts + "'" + ", " + "NULL" + " , " + "'" + pointId + "'" + ")"; 
} 
else{ 
System.out.println("Insert ts: " + ts + " val: " + val); 
sql= "INSERT INTO " + table + "(ts,val,pointId)" + " VALUES" + "(" + "'" + ts + "'" + ", " + "'" + val + "'" + ", " + "'" + pointId + "'" + ")"; 
} 

Statement st = (Statement) conn.createStatement(); //create the instances of statement 
count = st.executeUpdate(sql); 

असल में, (वैल) मूल्य (शून्य) यदि डेटाबेस में डालने अशक्त, बस तालिका में सम्मिलित है।

+1

यह एक पूरी तरह से वैध समाधान है (जिसे थोड़ा छोटा किया जा सकता है), बहुत बुरा यह किसी भी स्पष्टीकरण के बिना डाउनवॉट किया गया था – svarog

2

मार्क Rotteveel के जवाब के लिए एक विकल्प के रूप में, आप भी PreparedStatement.setObject(int, Object, int) उपयोग कर सकते हैं।

आप SQL प्रकार (तृतीय पैरामीटर) निर्दिष्ट करते हैं, और यदि ऑब्जेक्ट शून्य है, तो यह स्वचालित रूप से एक शून्य को सम्मिलित करता है। यह तेज़ और आसान है।

String sql = "INSERT INTO temp(val) VALUES (?)"; 
PreparedStatement st = con.prepareStatement(sql); 
st.setObject(1, value, Types.INTEGER); 
count = st.executeUpdate(); 
संबंधित मुद्दे