You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL自引用外键parent_id设为NULL默认值的实现问题

解决PostgreSQL中containers表parent_id默认值为NULL的问题

你之前的错误核心是给parent_id误用了SERIAL类型。在PostgreSQL里,SERIAL并非普通数据类型,它会自动创建一个序列,并把列的默认值设为该序列的nextval()结果。这就是插入数据时parent_id自动生成值的原因,也是添加DEFAULT NULL报错“multiple default values specified”的根源——SERIAL已经隐含设置了默认值,不能重复指定。

正确建表语句

把parent_id的类型改为integer(SERIAL本质就是integer加序列默认值),作为外键引用containers(id)即可,此时该列默认值就是NULL,无需额外声明:

CREATE TABLE containers (
    id SERIAL PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    parent_id INTEGER REFERENCES containers(id)
);

验证效果

执行插入操作:

INSERT INTO containers(name) VALUES('test_name');

查询结果会符合预期:

id |   name    | parent_id
----+-----------+-----------
  1 | test_name |         NULL
(1 row)

已创建表的修改方案

如果表已经创建,可通过ALTER TABLE语句修改:

ALTER TABLE containers 
    ALTER COLUMN parent_id DROP DEFAULT;

注:parent_id的实际类型已经是integer(SERIAL创建的列类型就是integer),只需移除SERIAL隐含的序列默认值,即可让默认值恢复为NULL。

内容的提问来源于stack exchange,提问作者galah92

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 21:35:55