2012-11-14 7 views
8

私はDebian 4.4.5-8,64ビット版x86_64-pc-linux-gnuでPostgreSQL 8.4.13を使用しています。PSQLException:エラー:カラムのnull値がnullでない制約に違反しています

私は、次の表に作成しました:Javaアプリケーションを使用して、その後

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つの 'setString'しかないのはなぜですか?また、それらは順序が間違っているようです... – durron597

+0

SQL文に3つの列を指定し、5つのバインドパラメータを指定すると、疑問符が多すぎます。挿入列として 'id'を追加し、疑問符を削除するか、余分な疑問符を削除してください。 – Glenn

+0

ありがとうございました!余分な疑問符とアウト・オブ・オーダーの問題は、単純なバージョンを提示するコードの変更によるコピー・ペースト・エラーでした。私はそれを訂正した。 – Maestros

答えて

6

@muがコメントしたように、エラーメッセージは残りの質問と矛盾します。

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

そして、あなたのテーブルを確認してください。

だけの合理的な説明の左側には、あなたが、実際には、別のテーブルに

てみてくださいを書いているということです。 INSERTは期待したテーブルに到着しましたか?そうでない場合は、設定を確認してください:

  • IP、ポート、db名?
  • DBに同じスキーマがありますか? search_pathの設定を確認してください。
  • 偶然、テーブル名「USERS」を二重引用符で囲まれていませんか?二重引用符で囲まれた識別子は小文字に変換されません。詳細については、Identifiers and Key Wordsの章をお読みください。

usersの別のインスタンスを見つけ、潜在的な被害を修正します。 :)

+0

ありがとう、アーウィン!私は正しい表に書いていました。問題は、シリアル・シーケンスを別の表(別のスキーマ)に追加したことです。したがって、Javaアプリケーションが書き込んでいたテーブルには、user_idカラムにシリアル・シーケンスがありませんでした。ご協力ありがとうございました! – 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(); 

3つの疑問符しか表示されず、フィールドが正しく並んでいることに注意してください。

NOT NULLという制約もありません。それは自分自身を処理します(どうすればNULL、それはSERIALです)、あなたのエラーを引き起こす可能性があります。ただそれを削除します。

+0

ありがとうございました!余分な疑問符とアウト・オブ・オーダーの問題は、単純なバージョンを提示するコードの変更によるコピー・ペースト・エラーでした。私はコードを修正しました。この問題は、データベースの自動インクリメント列に関連しているようです。 – Maestros

+0

@ user1822596:何か間違って追加しました。 – durron597

関連する問題