2012-11-14 2 views
8

Debian 4.4.5-8, 64 비트에서 x86_64-pc-linux-gnu에 PostgreSQL 8.4.13을 사용하고 있습니다.PSQLException : 오류 : 열의 null 값이 null이 아닌 제약을 위반합니다.

나는 다음 표 만들었습니다 자바 응용 프로그램을 사용하여, 다음

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 개와'setString' 만 3 개입니까? 또한 그들은 순서가 잘못된 것 같습니다 ... – 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

감사합니다. Erwin! 나는 올바른 표에 쓰고 있었다. 문제는 직렬 시퀀스를 다른 테이블 (다른 스키마)에 추가했기 때문입니다. 따라서 자바 애플리케이션이 작성한 테이블에는 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(); 

세 개의 물음표 만 표시하면 필드가 올바르게 정렬됩니다.

NOT NULL 제약 조건에 대해서도 걱정할 필요가 없습니다. 자체 처리합니다 (NULL 일 수있는 방법, SERIAL). 그러면 오류가 발생할 수 있습니다. 그냥 제거하십시오.

+0

답변 해 주셔서 감사합니다.여분의 물음표와 고장 명령은 간단한 버전을 제시하는 코드의 수정으로 인해 복사 붙여 넣기 오류가 발생했습니다. 코드를 수정했습니다. 문제는 데이터베이스의 자동 증가 열과 관련이있는 것으로 보입니다. – Maestros

+0

@ user1822596 : 다른 것을 추가했습니다. 시도해보십시오. – durron597

관련 문제