Postgresql INSERT要求主键值?

时间:2018-03-24 19:33:17

标签: sql postgresql sql-insert

运行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 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分: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');

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