作为一个例子
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
值的记录?
答案 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
实际上是非常不同的。