2012-11-14 32 views
8

का उल्लंघन करता है मैं डेबियन 4.4.5-8, 64-बिट पर x86_64-pc-linux-gnu पर PostgreSQL 8.4.13 का उपयोग कर रहा हूं।PSQLException: त्रुटि: कॉलम में शून्य मान शून्य-शून्य बाधा

मैं निम्न तालिका बनाई है:

CREATE TABLE users (
user_id    serial PRIMARY KEY NOT NULL, 
name    varchar(200), 
username   varchar(150), 
password   varchar(150), 
); 

फिर, एक जावा अनुप्रयोग का उपयोग कर, मैं निम्नलिखित कोड निष्पादित करें:

String insertTableSQL = "INSERT INTO USERS" 
       + "(name, username, password) VALUES" 
       + "(?,?,?)"; 
PreparedStatement preparedStatement = DBCon.prepareStatement(insertTableSQL); 
preparedStatement.setString(1, userInfo.get("name"));   
preparedStatement.setString(2, userInfo.get("username")); 
preparedStatement.setString(3, userInfo.get("password"))); 

preparedStatement.executeUpdate(); 

यहां मुद्दा यह है कि executeUpdate() निम्नलिखित उत्पन्न करता है अपवाद:

org.postgresql.util.PSQLException: ERROR: null value in column "user_id" violates not-null constraint 

अजीब बात यह है कि अगर मैं इसे निष्पादित करता हूं psql का उपयोग कर sert कथन, यह सफलतापूर्वक निष्पादित करता है।

किसी भी विचार की बहुत सराहना की जाएगी।

धन्यवाद।

+0

आपके पास 5 प्रश्न चिह्न क्यों हैं और केवल 3 'सेटस्ट्रिंग' है? इसके अलावा वे आदेश से बाहर प्रतीत होते हैं ... – durron597

+0

आपके पास अपने एसक्यूएल स्टेटमेंट में बहुत से प्रश्न चिह्न हैं (3 कॉलम निर्दिष्ट करते हुए 5 बाध्य पैरामीटर)। या तो 'id' को सम्मिलित कॉलम के रूप में जोड़ें और एक प्रश्न चिह्न हटाएं या अतिरिक्त प्रश्न चिह्न हटा दें। – Glenn

+0

आपके प्रतिक्रियाओं के लिए धन्यवाद! कोड के एक संशोधन के लिए कोड के संशोधन के कारण अतिरिक्त प्रश्न चिह्न और ऑर्डर समस्या से बाहर एक कॉपी-पेस्ट त्रुटि थी। मैंने इसे सही किया। – Maestros

उत्तर

6

जैसा कि @mu टिप्पणी की गई है, त्रुटि संदेश आपके शेष प्रश्न के विपरीत है।

INSERT INTO users (user_id, name, username, password) VALUES 
(1234,'foo', 'foo', 'foo')"; 

और अपनी मेज की जाँच करें:

केवल उचित स्पष्टीकरण बाईं है कि आप वास्तव में कर रहे हैं, एक अलग तालिका

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

  • आईपी, पोर्ट, डीबी नाम?
  • डीबी में समान स्कीमा? अपनी search_path सेटिंग जांचें।
  • आपने दुर्घटना से दो बार तालिका नाम "USERS" उद्धृत नहीं किया था? डबल-उद्धृत पहचानकर्ताओं को कम मामले में नहीं डाला जाता है। विवरण के लिए अध्याय Identifiers and Key Words पढ़ें ..

तालिका users तालिका का दूसरा उदाहरण ढूंढें और संभवतः आपके द्वारा किए गए संभावित नुकसान को ठीक करें। :)

+0

आपको बहुत धन्यवाद इरविन! मैं सही टेबल पर लिख रहा था। समस्या यह थी कि मैंने सीरियल अनुक्रम को एक अलग तालिका (विभिन्न स्कीमा) में जोड़ा। तो, जावा एप्लिकेशन जिस तालिका को लिख रहा था, उसमें उपयोगकर्ता_आईडी कॉलम पर कोई सीरियल अनुक्रम नहीं था। आपके सहयोग के लिए धन्यवाद! – Maestros

0
String insertTableSQL = "INSERT INTO USERS" 
      + "(name, username, password) VALUES" 
      + "(?,?,?)"; 
PreparedStatement preparedStatement = DBCon.prepareStatement(insertTableSQL); 
preparedStatement.setString(1, userInfo.get("name"));   
preparedStatement.setString(2, userInfo.get("username")); 
preparedStatement.setString(3, userInfo.get("password"))); 

preparedStatement.executeUpdate(); 

केवल तीन प्रश्न चिह्नों को नोट करें और अब फ़ील्ड सही तरीके से लाइन करें।

NOT NULL बाधा के बारे में भी चिंता न करें। यह स्वयं को संभालेगा (यह कभी भी NULL कैसे हो सकता है, यह SERIAL है) और आपकी त्रुटि उत्पन्न हो सकती है। बस इसे हटा दें।

+0

आपकी प्रतिक्रिया के लिए धन्यवाद!कोड के एक संशोधन के लिए कोड के संशोधन के कारण अतिरिक्त प्रश्न चिह्न और ऑर्डर समस्या से बाहर एक कॉपी-पेस्ट त्रुटि थी। मैंने कोड को सही किया। समस्या डेटाबेस के ऑटो वृद्धि कॉलम से संबंधित प्रतीत होती है। – Maestros

+0

@ user1822596: मैंने कुछ और गलत जोड़ा, कोशिश करें। – durron597