Могут ли ссылки на внешние ключи содержать значения NULL в PostgreSQL?

В качестве примера

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?

Ответ 1

В таблице 1 этот оператор INSERT будет успешным. Если вы запустите его 100 раз, он будет успешным 100 раз.

insert into referencing_table values (null);

То же самое выражение INSERT не будет выполнено в таблице 2.

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

Ответ 2

Иногда вы хотите, чтобы столбец с внешним ключом обнулялся, потому что он не требуется (точно так же, как не каждый гражданин в таблице граждан поступил в университет, поэтому столбец university_id может быть пустым). В других случаях столбец не должен быть нулевым, так как каждый студент должен быть связан с university_id.

Таким образом, два referencing_table, которые вы описываете, на самом деле очень разные, если учесть, чего вы пытаетесь достичь.