Внешний ключ BIGSERIAL NULL Postgres

#mysql #sql #database #postgresql #hibernate

#mysql #sql #База данных #postgresql #переход в спящий режим

Вопрос:

Я не могу вставить запись в базу данных POSTGRES, я хочу, чтобы внешний ключ был нулевым.

Моя таблица:

 CREATE TABLE sad_avaliado (
    id                BIGSERIAL NOT NULL,
    tenant_id         INT8 NOT NULL,
    funcionario_id    BIGSERIAL NOT NULL,
    epoca_id          BIGSERIAL NOT NULL,
    cca_id            BIGSERIAL,
    avaliador_id      BIGSERIAL NOT NULL,
    apagado           boolean NOT NULL,
    PRIMARY KEY (id)
 );
alter table sad_avaliado add constraint sad_funcionario_fkey foreign key (funcionario_id) references sad_funcionario;
alter table sad_avaliado add constraint sad_epoca_fkey foreign key (epoca_id) references sad_epoca;
alter table sad_avaliado add constraint sad_cca_fkey foreign key (cca_id) references sad_cca;
alter table sad_avaliado add constraint sad_avaliador_fkey foreign key (avaliador_id) references sad_avaliador;
  

Моя вставка SQL:

 INSERT INTO public.sad_avaliado(
id, tenant_id, funcionario_id, epoca_id, cca_id, avaliador_id, apagado)
VALUES (1, 1, 1, 1, null, 1, false);
  

Моя ошибка:

 ERROR:  null value in column "cca_id" violates not-null constraint
  

Комментарии:

1. Вы должны использовать только один [большой] серийный номер для каждой таблицы. Сделайте поля int8, удалите значения по умолчанию, удалите последовательности. Также столбец может иметь not null значение по умолчанию, потому что это bigserial. Проверьте с d sad_avaliado

Ответ №1:

Ссылки на внешний ключ для BIGSERIAL должны использовать BIGINT :

 CREATE TABLE sad_avaliado (
    id                BIGSERIAL NOT NULL,
    tenant_id         INT8 NOT NULL,
    funcionario_id    BIGINT NOT NULL,
    epoca_id          BIGINT NOT NULL,
    cca_id            BIGINT,
    avaliador_id      BIGINT NOT NULL,
    apagado           boolean NOT NULL,
    PRIMARY KEY (id)
 );
  

Я думаю, что это единственное исключение из представления о том, что ссылки на внешний ключ должны иметь тот же тип, что и первичный ключ. Я имею в виду, что базовый тип тот же, но BIGSERIAL используется для указания того, что он автоматически увеличивается (другие базы данных используют отдельное ключевое слово, такое как auto_increment или identity ).

Комментарии:

1. Это было действительно полезно 🙂 На самом деле я создавал таблицу и задавался вопросом, почему некоторые из моих столбцов автоматически устанавливаются в обязательное значение и имеют последовательность в их определении как «column_default». Я не думал о том, что «bigserial» на самом деле является оболочкой для «bigint», которая увеличивает рекламу; Я думаю, может быть, тот факт, что я в основном использовал базы данных Oracle, отчасти объясняет меня?

Ответ №2:

bigserial предназначен для автоматически добавляемых столбцов идентификаторов и по умолчанию имеет значение «not null» и создает одну последовательность.

И вы не должны указывать свой идентификатор в операторах insert, поскольку он вставляется по умолчанию с помощью nextval()

смотрите этот пример

     test=# create table test01 ( id bigserial );
    CREATE TABLE
    test=# d test01*
                                Table "public.test01"
     Column |  Type  | Collation | Nullable |              Default               
    -------- -------- ----------- ---------- ------------------------------------
     id     | bigint |           | not null | nextval('test01_id_seq'::regclass)

                           Sequence "public.test01_id_seq"
      Type  | Start | Minimum |       Maximum       | Increment | Cycles? | Cache 
    -------- ------- --------- --------------------- ----------- --------- -------
     bigint |     1 |       1 | 9223372036854775807 |         1 | no      |     1
    Owned by: public.test01.id
  

Ответ №3:

Используйте bigint вместо bigserial .