Могут ли ссылки на внешние ключи содержать значения 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
, которые вы описываете, на самом деле очень разные, если учесть, чего вы пытаетесь достичь.