外键BIGSERIAL NULL Postgres

时间:2019-04-24 06:16:06

标签: mysql sql database postgresql hibernate

我无法在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

2 个答案:

答案 0 :(得分:0)

bigserial用于自动递增的id列,其默认值为“ not null”并创建一个序列。

并且您不应该在insert语句中指定ID,因为它是通过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

答案 1 :(得分:0)

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或{{ 1}})。