【问题标题】:Postgresql INSERT is asking for primary key value?Postgresql INSERT 要求主键值?
【发布时间】:2018-03-24 19:33:17
【问题描述】:

运行 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是串行主键,不应该是自动填充和自增吗?

【问题讨论】:

    标签: sql postgresql sql-insert


    【解决方案1】:

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

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

    【讨论】:

    • 好的,但是我有另一个表role 的主键为id,并且只有一个其他列role,我可以成功地添加数据,例如insert into role values ('XYZ');。那么这是否仅适用于具有多个非(主键)列的表?
    • 没有。在您提到的表格中,id 可能是第二列。
    【解决方案2】:

    如果您查看表定义,您会发现该列实际上是这样定义的:

    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');
    

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

    【讨论】:

    • 查看我对 Mureinik 回答的评论
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2012-08-03
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    相关资源
    最近更新 更多