代码之家  ›  专栏  ›  技术社区  ›  sigil

Postgresql INSERT正在请求主键值?

  •  7
  • sigil  · 技术社区  · 6 年前

    运行Postgres 9.6.6。我创建了一个如下表:

    create table person (
    id serial primary key,
    name text,
    role integer references role (id),
    phonenumber text);
    

    当我尝试按以下方式插入数据时:

    insert into person values ('This Person',2,'+15105551111');
    

    我收到以下消息:

    ERROR: invalid input syntax for integer: 'This Person'
    

    这表明Postgres期望 id 。但如果 id号 是一个串行主键,它不应该是自动填充和自动递增的吗?

    2 回复  |  直到 6 年前
        1
  •  7
  •   Mureinik    6 年前

    如果未指定列名,则这些值将应用于第一个 n 表中的列。因此 'This Person' 将应用于 id ,从而得到错误。您可以(应该)指定列名称以避免此问题:

    INSERT INTO person
    (name, role, phonenumber) -- Here
    VALUES ('This Person', 2, '+15105551111');
    
        2
  •  2
  •   Laurenz Albe    6 年前

    如果查看表定义,您将看到该列实际上是这样定义的:

    id integer DEFAULT nextval('person_id_seq'::regclass)
    

    这是因为 serial 只是一个速记。

    这意味着只有在没有显式插入值的情况下才使用自动生成的值。但是自从你 INSERT 语句没有列列表,实际插入到 全部的 列,因此第一个值将插入到第一列中,这将导致错误。

    可以显式列出列:

    INSERT INTO person (name, role, phonenumber)
       VALUES ('This Person', 2, '+15105551111');
    

    或者您可以使用 DEFAULT 要指定应使用默认值,请执行以下操作:

    INSERT INTO person
       VALUES (DEFAULT, 'This Person', 2, '+15105551111');
    

    第一种解决方案更好,因为明确列总是好的(表可以更改)。