外键引用可以在PostgreSQL中包含NULL值吗?

时间:2015-01-29 02:52:14

标签: postgresql reference foreign-keys primary-key

作为一个例子

create table indexing_table
(
  id SERIAL PRIMARY KEY,
  created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
);

下表之间有区别吗?

表1:

create table referencing_table
(
  indexing_table_id INTEGER references indexing_table
);

表2:

create table referencing_table
(
  indexing_table_id INTEGER references indexing_table NOT NULL
);

或者,如果表1中没有NOT NULL约束,我们是否允许插入包含NULL值的记录?

2 个答案:

答案 0 :(得分:24)

对于表1,此INSERT语句将成功。如果你运行100次,它将成功100次。

insert into referencing_table values (null);

表2中的相同INSERT语句将失败。

ERROR:  null value in column "indexing_table_id" violates not-null constraint
DETAIL:  Failing row contains (null).

答案 1 :(得分:1)

有时候您希望外键列为空,因为它不是必需的(就像不是公民表中的每个 citizen 都去过大学一样,因此university_id列可以是空值)。在其他情况下,该列不应为null,就像每个学生应该与一个university_id相关联一样。

因此,如果您考虑要实现的目标,那么您描述的两个referencing_table实际上是非常不同的。