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) и может быть причиной ошибки. Просто уберите его.