PostgreSQL可以为空的外键

use*_*897 10 postgresql nullable key foreign-keys

我正在创建一个postgreSQL表,它有一个引用自己的外键,所以它是一个类似于树的结构:

CREATE TABLE Person(
    ID serial PRIMARY KEY,
    Description text,
    Name varchar(5),
    ParentID serial,
    FOREIGN KEY (ParentID) REFERENCES Person(ID)
    );
Run Code Online (Sandbox Code Playgroud)

问题是ParentID自动设置为NOT NULL,因此该树中没有root.我如何让它可以为空?

小智 13

您可能希望将ParentID的类型更改为整数,这是串行的基础类型.

CREATE TABLE Person(
    ID serial PRIMARY KEY,
    Description text,
    Name varchar(5),
    ParentID integer,
    FOREIGN KEY (ParentID) REFERENCES Person(ID)
);
Run Code Online (Sandbox Code Playgroud)

有关整数和串行数据类型的文档,请访问:http://www.postgresql.org/docs/current/static/datatype-numeric.html

  • 解释一下:`serial`基本上是一个宏,它扩展为`integer default nextval('tablename_colname_seq')`并创建一个由表拥有的序列.对于外键,您不需要或不需要它,它仅对自动生成的键列有用.所以使用`integer`.如果用`\ dt Person`检查基表,你会看到`id`列在表创建后真的是`integer`. (8认同)