运行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
是串行主键,那么它不应该是自动填充和自动增量吗?
答案 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');
第一种解决方案更好,因为明确关于列(表格可以改变)总是好的。