Я хочу удалить строки из двух таблиц, которые зависят друг от друга с помощью набора отложенных ограничений. Чтобы упростить этот пост, я смоделировал простую схему БД.
Я надеюсь удалить записи из некоторой таблицы 'delete_from_me' внутри транзакции SQL / DB Patch. Уловка в том, что я хочу удалить на основе выбора из второй таблицы 'constraining_table', прежде чем потерять саму ссылку.
Вот описание двух таблиц:
tab-quarantine=> \d delete_from_me
Table "public.delete_from_me"
Column | Type | Modifiers
-----------+-------------------+-----------
id | character varying | not null
extension | character varying | not null
Indexes:
"delete_from_me_pkey" PRIMARY KEY, btree (id)
tab-quarantine=> \d constraining_table
Table "public.constraining_table"
Column | Type | Modifiers
--------+-------------------+-----------
image | character varying | not null
type | character varying | not null
Foreign-key constraints:
"constraining_table_image_fkey" FOREIGN KEY (image) REFERENCES delete_from_me(id)
ON UPDATE CASCADE
ON DELETE RESTRICT DEFERRABLE
Вот некоторые примеры данных, которые я только что там написал:
tab-quarantine=> SELECT * FROM delete_from_me;
id | extension
------------+-----------
12345abcde | png
(1 row)
tab-quarantine=> SELECT * FROM constraining_table;
image | type
------------+----------
12345abcde | select_me
(1 row)
И вот моя транзакция:
BEGIN;
\set ON_ERROR_STOP 1
SET CONSTRAINTS ALL DEFERRED;
DELETE FROM delete_from_me WHERE id IN (
SELECT image FROM constraining_table WHERE type = 'select_me'
);
DELETE FROM constraining_table WHERE type = 'select_me';
COMMIT;
Эта транзакция не выполнена. Когда я перехожу и делаю это вручную, мне выдается следующее сообщение об ошибке:
ERROR: update or delete on table "delete_from_me" violates foreign key constraint "constraining_table_image_fkey" on table "constraining_table"
DETAIL: Key (id)=(12345abcde) is still referenced from table "constraining_table".
Это похоже на хороший кандидат на временную таблицу, однако я хотел бы знать, почему так это то, что я не могу удалить в этом порядке, поскольку ограничения не должны быть эффективными до конца сделка?