DDL / СхемаНачальный
FOREIGN KEY
Ограничение, связывающее колонку с первичным ключом другой таблицы. Обеспечивает ссылочную целостность.
Синтаксис
REFERENCES parent_table(parent_col) [ON DELETE CASCADE|SET NULL|RESTRICT]Объяснение
FOREIGN KEY гарантирует: в колонке могут быть только значения, существующие в родительской таблице.
При DELETE/UPDATE родительской строки: ON DELETE CASCADE (удалить дочерние), ON DELETE SET NULL, ON DELETE RESTRICT (запретить, по умолчанию).
Всегда добавляй индекс на колонку FK — иначе поиск и JOIN медленные.
Пример
CREATE TABLE orders (
id BIGINT PRIMARY KEY,
user_id BIGINT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
product_id BIGINT REFERENCES products(id) ON DELETE RESTRICT
);
-- Индекс на FK обязателен!
CREATE INDEX ON orders (user_id);Связанные термины
Анекдоты по теме
— Почему PRIMARY KEY не может быть NULL? — Потому что паспорт без номера — это не паспорт. «Я есть, но кто я — неизвестно» — так не работает.
— Нужно ли использовать SERIAL или IDENTITY для первичного ключа? — SERIAL — это старый синтаксис через sequence. IDENTITY (SQL стандарт, PostgreSQL 10+) — современный. — Какой выбрать? — GENERATED ALWAYS AS IDENTITY. Не позволяет случайно вставить своё значение.
— Как хранить деньги в базе данных? — DECIMAL(19,4) или NUMERIC(19,4). — Почему не FLOAT? — Потому что FLOAT неточный. 0.1 + 0.2 = 0.30000000000000004. — В банке это было бы проблемой. — Именно.