【问题标题】:Postgres breaking null constraint on a serial columnPostgres 打破串行列上的空约束
【发布时间】:2020-02-10 06:39:44
【问题描述】:

我有一个我独立创建的表,主键设置为序列类型和应用于表的序列,但是当我尝试插入一个值时,抛出一个 NULL CONSTRAINT 错误,并且返回看起来像 null 是通过了,我是不是在 INSERT 语句中遗漏了什么?

生成表的 SQL:

    DROP TABLE IF EXISTS public."Team" CASCADE;

CREATE TABLE public."Team" (
    "IdTeam" serial PRIMARY KEY,
    name text NOT null,
    CONSTRAINT "pKeyTeamUnique" UNIQUE ("IdTeam")
);

ALTER TABLE public."Team" OWNER TO postgres;

DROP SEQUENCE IF EXISTS public."Team_IdTeam_seq" CASCADE;

CREATE SEQUENCE public."Team_IdTeam_seq"
    AS integer
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;

ALTER TABLE public."Team_IdTeam_seq" OWNER TO postgres;

ALTER SEQUENCE public."Team_IdTeam_seq" OWNED BY public."Team"."IdTeam";

插入的 SQL:

INSERT INTO public."Team" (name) values ('Manchester Untited');

返回错误:

ERROR:  null value in column "IdTeam" violates not-null constraint
DETAIL:  Failing row contains (null, Manchester Untited).
SQL state: 23502

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    我很困惑。当列已定义为 serial 时,为什么还要尝试定义自己的序列?

    其次,主键约束已经是唯一的。不需要单独的唯一约束。

    第三,引用标识符只会使代码更难编写和阅读。

    你可以这样做:

    DROP TABLE IF EXISTS public.Team CASCADE;
    
    CREATE TABLE public.Team (
        IdTeam serial PRIMARY KEY,
        name text NOT null
    );
    
    INSERT INTO public.Team (name) 
        VALUES ('Manchester Untited');
    

    【讨论】:

    • 这可能是我缺乏知识,在其他表中我使用了 biginteger 但我遇到了没有自动生成的问题,更改为串行似乎可以回答这个问题,我同意没有附加约束的要求。我会试试你的建议
    【解决方案2】:

    删除序列会导致删除 IdTeam 列的默认定义。重新创建序列后,您必须重新创建默认定义。

    【讨论】:

    • 是的,删除序列并重新创建它,然后删除表并创建它解决了问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 2016-12-15
    • 1970-01-01
    相关资源
    最近更新 更多