2012-11-14 41 views
8

Tôi đang sử dụng PostgreSQL 8.4.13 trên x86_64-pc-linux-gnu trên Debian 4.4.5-8, 64-bit.PSQLException: ERROR: giá trị null trong cột vi phạm ràng buộc không null

Tôi đã tạo ra bảng sau:

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

Sau đó, sử dụng một ứng dụng Java, tôi thực thi đoạn mã sau:

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(); 

Vấn đề ở đây là executeUpdate() tạo ra sau ngoại lệ:

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

Điều kỳ lạ là nếu tôi thực hiện tương tự sert tuyên bố bằng cách sử dụng psql, nó thực hiện thành công.

Bất kỳ ý tưởng nào cũng sẽ được đánh giá cao.

Cảm ơn bạn.

+0

Tại sao bạn có 5 dấu hỏi và chỉ 3 'setString'? Ngoài ra chúng dường như không đúng thứ tự ... – durron597

+0

Bạn có quá nhiều dấu hỏi trong câu lệnh sql của bạn (chỉ định 3 cột nhưng 5 tham số liên kết). Hãy thêm 'id' làm cột chèn và xóa dấu chấm hỏi hoặc xóa dấu chấm hỏi thêm. – Glenn

+0

Cảm ơn bạn đã trả lời! Dấu hỏi thêm và vấn đề không đúng thứ tự là lỗi sao chép-dán do sửa đổi mã để trình bày một phiên bản đơn giản của nó. Tôi sửa nó rồi. – Maestros

Trả lời

6

Khi @mu nhận xét, thông báo lỗi mâu thuẫn với phần còn lại của câu hỏi của bạn.

duy nhất hợp lý giải thích trái là hai người là bạn, trên thực tế, viết vào một bảng khác nhau

Hãy thử:

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

Và kiểm tra bảng của bạn. INSERT có đến bàn bạn mong đợi không? Nếu không, hãy kiểm tra cài đặt của bạn:

  • IP, cổng, tên db?
  • Cùng một lược đồ trong DB? Kiểm tra cài đặt search_path của bạn.
  • Bạn không vô tình báo giá gấp đôi tên bảng "NGƯỜI DÙNG"? Các số nhận dạng được trích dẫn kép không được truyền sang chữ thường. Đọc chương Identifiers and Key Words để biết chi tiết ..

Tìm trường hợp khác của bảng users và sửa chữa hư hỏng tiềm năng bạn có thể đã làm. :)

+0

Cảm ơn bạn rất nhiều Erwin! Tôi đã viết cho đúng bảng. Vấn đề là tôi đã thêm chuỗi nối tiếp vào một bảng khác (lược đồ khác). Vì vậy, bảng mà ứng dụng java đã viết tới, không có chuỗi tuần tự tại cột user_id. Cảm ơn sự giúp đỡ của bạn! – 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(); 

Lưu ý chỉ ba dấu hỏi và giờ là trường được xếp hàng chính xác.

Cũng đừng lo lắng về ràng buộc NOT NULL. Nó sẽ xử lý chính nó (làm thế nào nó có thể là NULL, nó là SERIAL) và có thể gây ra lỗi của bạn. Chỉ cần loại bỏ nó.

+0

Cảm ơn bạn đã trả lời!Dấu hỏi thêm và vấn đề không đúng thứ tự là lỗi sao chép-dán do sửa đổi mã để trình bày một phiên bản đơn giản của nó. Tôi đã sửa mã. Vấn đề dường như liên quan đến cột tăng tự động của cơ sở dữ liệu. – Maestros

+0

@ user1822596: Tôi đã thêm một số thứ khác sai, hãy thử điều đó. – durron597

Các vấn đề liên quan