ORA-01400: невозможно вставить NULL

Создается таблица последством liquibase

    databaseChangeLog:
  - changeSet:
      validCheckSum: ANY
      id: 1
      author: some
      changes:
        - createTable:
            tableName: REG_STATUS
            columns:
              - column:
                  name: id
                  type: BIGINT
                  autoIncrement: true
                  constraints:
                    primaryKey: true
                    nullable: false
              - column:
                  name: reg_id
                  type: BIGINT
              - column:
                  name: created_on
                  type: Timestamp
              - column:
                  name: display_offset
                  type: Timestamp
              - column:
                  name: status
                  type: varchar(50)

затем в нее передается Insert посредством jdbcTemplate.update либо просто запросом через консоль - результат один. ORA-01400: невозможно вставить NULL .

код

private static final String SAVE_NEW_REG_STATUS = "insert into REG_STATUS (REG_ID, CREATED_ON, DISPLAY_OFFSET, STATUS) values (:reg_id, :created_on, :display_offset, :status)";

Map<String, Object> paramMap = new HashMap<>();
        paramMap.put("reg_id", 100);
        paramMap.put("created_on", Timestamp.valueOf("2021-05-31 13:13:11.6469816"));
        paramMap.put("display_offset", Timestamp.valueOf("2021-05-31 13:13:11.6469816"));
        paramMap.put("status", "NEW");
        int status = jdbcTemplate.update(SAVE_NEW_REG_STATUS, paramMap);

либо просто запросом

INSERT INTO REG_STATUS
(REG_ID, CREATED_ON, DISPLAY_OFFSET, STATUS)
VALUES
(5000, '2021-05-31 13:13:11.6469816', '2021-05-31 13:13:11.6469816', 'NEW');

ответ

[23000][1400] ORA-01400: невозможно вставить NULL в ("PS_REPORT"."REG_STATUS"."ID")

разве нужно специально прописывать ID? он же должен генериться самостоятельно.


Ответы (1 шт):

Автор решения: 0xdb

В версии 11g не было ещё опции автоинкремента.

Надо вручную добавить последовательность и триггер, и приложение при вставке воспримет это как автоинкремент:

create sequence reg_status_seq nocycle nocache;

create or replace trigger reg_status_autoinc
    before insert on reg_status for each row
begin
    if :new.reg_id is null then
        :new.REG_ID := name_of_sequence.nextval;
    end if;
end;
/

И всё будет работать:

insert into reg_status (created_on, display_offset, status) values (
    timestamp'2021-05-31 13:13:11.6469816', timestamp'2021-05-31 13:13:11.6469816', 'new');

1 row inserted.
→ Ссылка