Что вы имеете в виду, это не FOREIGN KEY
, который в PostgreSQL относится к столбцу (количеству) в другой таблице, где есть уникальный индекс в том или ином столбце (столбцах) и которые могут иметь связанные автоматические действия при изменении значений (-ов) того или иного столбца (-ов) (ON UPDATE
, ON DELETE
).
Вы пытаетесь обеспечить конкретную ссылочную целостность, аналогичную тому, что делает FOREIGN KEY
. Вы можете сделать это с помощью предложения CHECK
и функции (потому что в предложении CHECK
не разрешены подзапросы), вы также можете сделать это с помощью table inheritance and range partitioning (см. Дочернюю таблицу, которая содержит только строки, где type = 'X'
), но это, вероятно, Проще всего сделать это с помощью триггера:
CREATE FUNCTION trf_test_type_x() RETURNS trigger AS $$
BEGIN
PERFORM * FROM tableB WHERE id = NEW.table_b_id AND type = 'X';
IF NOT FOUND THEN
-- RAISE NOTICE 'Foreign key violation...';
RETURN NULL;
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE tr_test_type_x
BEFORE INSERT OR UPDATE ON tableA
FOR EACH ROW EXECUTE PROCEDURE trf_test_type_x();
Вы можете создать частичный индекс на tableB
, чтобы ускорить процесс:
CREATE UNIQUE INDEX idx_type_X ON tableB(id) WHERE type = 'X';
Могу ли я определить вложенную таблицу с наследованием, которые включают в себя только часть исходных строк таблицы? –