Таким образом, вы намереваетесь запустить заказ INSERT
для таблицы, и вы ожидаете, что на дублирующих ключах это будет на самом деле DELETE
связанная запись. Хотя это технически осуществимо, я бы не рекомендовал эту настройку, потому что это действие на расстоянии , которое трудно отладить.
Функциональность такого же типа, однако, может быть достигнута с помощью функции Postgres. Это делает намерение явным, когда речь идет о переключении подписки, и не мешает стандартным операторам базы данных (INSERT
).
Вот код для функции: она принимает два параметра в качестве входных данных, проверяет, есть ли уже запись в таблице подписок, и затем выполняет соответствующую операцию; он возвращает 0
на DELETE
и 1
на INSERT
. Вы можете увидеть эту скрипку БД для полной демонстрации того, как она работает.
CREATE OR REPLACE FUNCTION toggle_subscription(
pid NUMERIC,
tid NUMERIC
)
RETURNS NUMERIC AS $$
DECLARE
row_exists NUMERIC;
BEGIN
SELECT 1
INTO row_exists
FROM thread_subscription
WHERE profile_id = pid and thread_id = tid;
IF (row_exists > 0) THEN
DELETE FROM thread_subscription WHERE profile_id = pid and thread_id = tid;
RETURN 0;
ELSE
INSERT INTO thread_subscription(profile_id, thread_id) VALUES(pid, tid);
RETURN 1;
END IF;
END;
$$
LANGUAGE plpgsql;