PostgreSQL插入messages表时id列空值违反非空约束的报错问题求助
解决PostgreSQL插入数据时id字段非空约束报错的问题
嘿,这个问题我太熟悉啦!咱们先搞清楚报错原因:你的messages表中id字段是主键且非空,但你执行插入语句时没有给id赋值,PostgreSQL不会自动为主键生成默认值,所以触发了非空约束的错误。
下面给你两种靠谱的解决方案:
方案一:让id字段自动生成推荐
这是最常用的方式,修改表结构让id自动递增,以后插入数据就不用手动管它了。PostgreSQL有两种实现方式:
方式1:使用SQL标准的IDENTITY推荐PostgreSQL 10+
执行这条SQL修改表结构:
ALTER TABLE messages ALTER COLUMN id ADD GENERATED ALWAYS AS IDENTITY;
修改完成后,再执行你原来的插入语句:
INSERT INTO messages(message) VALUES ('abc');
PostgreSQL会自动为id分配递增的数值,不会再报错啦。
方式2:使用PostgreSQL特定的SERIAL兼容旧版本
如果你的PostgreSQL版本低于10,可以用SERIAL类型实现自动递增:
ALTER TABLE messages ALTER COLUMN id TYPE serial;
本质上SERIAL是PostgreSQL帮你创建了一个序列,并把id的默认值设为序列的下一个值,效果和IDENTITY类似,但IDENTITY是SQL标准语法,更推荐使用。
方案二:手动指定id值不推荐除非特殊需求
如果你有特殊场景需要自己控制id的值,插入时明确指定id和message字段:
INSERT INTO messages(id, message) VALUES (1, 'abc');
但这种方式需要你自己保证id的唯一性,否则会触发主键重复的错误,所以一般不推荐。
内容的提问来源于stack exchange,提问作者Atulya
相关产品推荐
相关产品推荐

