Как установить поле автоинкремента в postgresql, отличное от id

У меня есть столбец я бы и столбец должность в таблице postgresql. Я хочу, чтобы позиция была автоинкрементной, поэтому я добавил должность, используя тип данных сериал: ALTER TABLE tbl ADD COLUMN position serial;

id       name     position
-------  -------  -------
1        S4       4
2        S2       2
3        S3       3
4        S1       1

Проблема в том, что когда я пытаюсь создать новый объект, у меня возникает следующая ошибка: org.postgresql.util.PSQLException: error: PSQLException: ERROR: null value in column "position" violates not-null

Что мне нужно сделать, чтобы установить автоматическое увеличение столбца должность?

Мой простой объект:

public class Stg {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
    @SequenceGenerator(name = "sequenceGenerator")
    private Long id;

    @NotNull
    @Size(max = 20)
    @Column(name = "name", length = 20, nullable = false)
    private String name;

    private Integer position;

Какая у вас версия Постгреса?

Tim Biegeleisen 24.01.2019 11:00

@TimBiegeleisen 10.1

Bob 24.01.2019 11:03

Каково ваше утверждение INSERT?

404 24.01.2019 11:05

Само по себе ваше заявление alter не должно вызывать эту ошибку, насколько я знаю.

Tim Biegeleisen 24.01.2019 11:07

Значения @404, которые я помещаю в оператор, выглядят так (5, S5, null), поэтому позиция явно нулевая, однако у меня нет этой проблемы с идентификатором - он генерируется

Bob 24.01.2019 11:09

@TimBiegeleisen должен ли я использовать какую-либо аннотацию в своем объекте?

Bob 24.01.2019 11:10

@Bob, если вы укажете NULL для ввода этого столбца, вы получите эту ошибку. Вам нужно сделать что-то вроде INSERT INTO table (id, name) VALUES (5, 'S5'); — игнорируя столбец position, который затем получит значение по умолчанию из последовательности. Я не могу комментировать, как вы это делаете с точки зрения Java, но именно так вы делаете это в PG.

404 24.01.2019 11:17

@404 Я не устанавливаю значение в поле Я БЫ, и оно генерируется правильно, и здесь похоже, что я поставил null

Bob 24.01.2019 11:20

ID не имеет значения, дело в том, что вы не можете установить NULL для position, потому что определение его как SERIAL означает, что он одновременно получает ограничение NOT NULL и значение по умолчанию NEXTVAL(your_sequence). Если вы укажете NULL для значения этого столбца, произойдет сбой из-за ограничения. Таким образом, вам нужно либо указать значение вручную - и в этом случае вы не должны были определять его как SERIAL - либо вы вообще не указываете этот столбец в своем INSERT, и в этом случае он будет автоматически использовать последовательность для получения автоматического увеличивающееся значение.

404 24.01.2019 12:20
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
9
1 490
1

Ответы 1

1. Вам нужно создать последовательность:

CREATE SEQUENCE sys_sequence_name START -9223372036854775808 MINVALUE -9223372036854775808 MAXVALUE 9223372036854775807;

Затем создайте таблицу, но после объявления параметра строки добавьте

CREATE TABLE table_name (

id          bigserial primary key,
var_with_seq    bigint not null default nextval('sys_sequence_name')

nextval('sys_sequence_name') - будет использоваться созданная вами последовательность.

Должен ли я добавить некоторую аннотацию к полю должность в классе Стг?

Bob 24.01.2019 11:31

Вы можете добавить выше частную целочисленную позицию @SequenceGenerator(name = "sys_sequence_name")

Karol Katanowski 24.01.2019 11:42

И обязательно добавьте @GeneratedValue(strategy=GenerationType.SEQUENCE,generator = "‌​sys_sequence_name")

Karol Katanowski 24.01.2019 11:46

Я пробовал раньше с этой аннотацией, но она не работает. Последовательность в postgres работает хорошо, но java все еще пытается поместить значение null в позицию

Bob 24.01.2019 11:53

хм, попробуйте добавить в аннотацию @SequenceGenerator(name = "sys_seq_position_name", sequenceName = "sys_sequence_name",allocationSize = 1) @GeneratedValue(strategy=GenerationType.SEQUENCE,generator = "‌​sys_sequence_positio‌​n_name") @Column(name= "position", insertable=false) частная длинная позиция

Karol Katanowski 24.01.2019 11:58

Я смотрел ту же тему, я думаю - не работает для меня. Когда я удаляю поле должность из класса, оно работает нормально, поэтому aut-increment работает хорошо, но java strill пытается поместить значение null в позицию.

Bob 24.01.2019 12:06

Спроси наверняка. У вас есть @Entity и @Table(name = "table_name_in_db") выше класса?

Karol Katanowski 24.01.2019 12:09

Тогда не знаю, сори.

Karol Katanowski 24.01.2019 12:15

Другие вопросы по теме