web-dev-qa-db-ja.com

PostgreSQLでは、外部キー参照にNULL値を含めることができますか?

例として

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
);

あるいは、NOT NULL制約がない表1の場合、NULL値を含むレコードを挿入できますか?

17
Alex

表1の場合、このINSERTステートメントは成功します。 100回実行すると、100回成功します。

insert into referencing_table values (null);

同じINSERTステートメントがテーブル2で失敗します。

エラー:「indexing_table_id」列のnull値はnull以外の制約に違反しています
詳細:失敗した行には(null)が含まれています。

場合によっては、外部キー列が必須ではないためnull可能にすることもできます(市民テーブルのcitizenがすべて大学に行くわけではないので、university_id列はnullになる可能性があります)。他の場合では、すべてのstudent lがuniversity_idに関連付けられている必要があるのと同様に、列はnullであってはなりません。

したがって、達成しようとしていることを考えると、2つのreferencing_tableは実際には大きく異なります。

2
richyen