PSQLException: ошибка: значение null в столбце нарушает ограничение not-null
Я использую PostgreSQL 8.4.13 на x86_64-pc-linux-gnu на Debian 4.4.5-8, 64-бит.
Я создал следующую таблицу:
CREATE TABLE users (
user_id serial PRIMARY KEY NOT NULL,
name varchar(200),
username varchar(150),
password varchar(150),
);
затем, используя приложение Java, я выполняю следующий код:
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
странно то, что если я выполняю тот же оператор insert с помощью psql, он выполняется успешно.
любые идеи будут значительно ценится.
спасибо.
2 ответов
как прокомментировал @mu, сообщение об ошибке противоречит остальной части вашего вопроса.
единственное разумное объяснение осталось в том, что вы, на самом деле, пишете другой таблице
попробуй:
INSERT INTO users (user_id, name, username, password) VALUES
(1234,'foo', 'foo', 'foo')";
и проверьте свой стол. Вставка прибыла к столу, который вы ожидали? Если нет, проверьте настройки:
- IP, порт, имя БД?
- та же схема в БД? Проверьте свой
search_path
настройка. - вы не случайно ли дважды процитировали название таблицы "пользователи"? Идентификаторы с двойными кавычками не приводятся в нижний регистр. Прочтите главу идентификаторы и ключевые слова для сведения..
найти другой экземпляр таблицы users
и исправить потенциальный ущерб, который вы, возможно, сделали. :)
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
) и может быть причиной ошибки. Просто уберите его.