Я бы использовал представление INNER JOIN
двух таблиц и посчитал бы строки в таблице applications
.(См. COUNT()
.) Триггеры могут быть отключены;это представление всегда даст вам правильный ответ.
(Позже ...)
Я понимаю, что вы хотите ограничить количество строк кандидата в "приложениях" таблицы до 3 или меньше.В этом случае, я думаю, лучше использовать ограничение CHECK()
для «приложений», а не комбинацию триггера для «приложений» и ограничение CHECK()
для «кандидатов».
Чтобы сделать это в PostgreSQL, вы должны использовать функцию и вызывать функцию из CHECK()
.(Насколько я знаю. Вы все еще не можете выполнить произвольные операторы SELECT
в ограничениях CHECK()
, верно?) Итак, вы бы создали эту функцию,
CREATE FUNCTION num_applications(cand_id integer)
RETURNS integer AS
$BODY$
DECLARE
n integer;
BEGIN
select count(*)
into n
from applications
where (candidate_id = cand_id);
return n;
END;
$BODY$
LANGUAGE plpgsql;
, а затем вы быдобавьте ограничение CHECK () к таблице 'application'.
ALTER TABLE applications
ADD CONSTRAINT max_of_three CHECK (num_applications(candidate_id) < 3);
"<3", поскольку ограничение <code>CHECK() оценивается перед добавлением строки.Вероятно, стоит проверить, как это происходит с отложенными ограничениями.Если у меня будет время, я сделаю это.