PostgreSQL插入数据时为何要求输入serial类型主键值?
问题原因与解决办法
这问题我太熟悉了!咱们一步步捋清楚:
为什么会报错?
你用的是不指定列名的INSERT写法:
insert into person values ('This Person',2,'+15105551111');
PostgreSQL会严格按照表定义的列顺序(id, name, role, phonenumber)来匹配你传入的值。你第一个值是字符串'This Person',但它被对应到了id列——而id是serial类型(本质是整数自增列),字符串当然没法转成整数,所以就报了ERROR: invalid input syntax for integer: 'This Person'。
虽然serial主键会自动生成自增值,但这只在你没有显式给id列传值,或者告诉Postgres用默认值的时候才生效。你现在的写法相当于强制给id列传了个字符串,自然就冲突了。
两种解决办法
方法1:明确指定要插入的列(推荐!)
这是最稳妥的写法,不管表结构怎么变,只要你指定的列存在,就不会出错:
insert into person (name, role, phonenumber) values ('This Person',2,'+15105551111');
这里我们只给name、role、phonenumber传值,id列会自动用自增值填充。
方法2:给id列传DEFAULT值
如果你一定要用不指定列的写法,得给id列留个位置,用DEFAULT让Postgres自动生成自增值:
insert into person values (DEFAULT, 'This Person',2,'+15105551111');
小提醒
强烈建议用第一种方法!因为如果以后你的表结构发生变化(比如新增列、调整列顺序),不指定列的INSERT语句很容易出现列值不匹配的问题,维护成本很高。
内容的提问来源于stack exchange,提问作者sigil
相关产品推荐
相关产品推荐

