Возможно ли ROLLBACK TO SAVEPOINT
с помощью CASE? Мой запрос
BEGIN;
SAVEPOINT my_savepoint;
INSERT INTO DPoint (uuid) VALUES ('5547f4b7-00b3-4aac-8ceb-c9ca163a0214')
ON CONFLICT (uuid) DO NOTHING;
WITH
ins1 AS (INSERT INTO Point (latitude, longitude, srid)
VALUES (37.251667, 14.917222, 4326) RETURNING id),
ins2 as (INSERT INTO SPoint (idPt, uuiddpt)
VALUES ((SELECT id FROM ins1), '5547f4b7-00b3-4aac-8ceb-c9ca163a0214') RETURNING id),
ins3 as (INSERT INTO Distance (idSpt, uuiddpt)
VALUES ((SELECT id FROM ins2), '5547f4b7-00b3-4aac-8ceb-c9ca163a0214'))
INSERT INTO DPointTS (uuid, type, name, idPoint)
VALUES ('5547f4b7-00b3-4aac-8ceb-c9ca163a0214', NULL, NULL, (SELECT id FROM ins1));
SELECT CASE WHEN
(SELECT uuid FROM DPoint
WHERE uuid = '5547f4b7-00b3-4aac-8ceb-c9ca163a0214' )
is not NULL THEN ROLLBACK TO SAVEPOINT my_savepoint END;
COMMIT;
Моя идея такова:
При попытке вставить еще раз DPoint.uuid='5547f4b7-00b3-4aac-8ceb-c9ca163a0214' не нужно вставлять Point, SPoint, Distance, DPointTS. Поэтому я хотел бы ОТМЕНИТЬ эти вставки в my_savepoint в транзакции. Может быть, есть идеи, каким образом я должен переписать свой код?
ИЗМЕНИТЬ:
SELECT uuid IS NULL AS is_not_uuid FROM DPoint WHERE uuid = '5547f4b7-00b3-4aac-8ceb-c9ca163a0214';
\gset
\if :is_not_uuid
\echo 'insert row to DPoint'
INSERT INTO DPoint (uuid) VALUES ('5547f4b7-00b3-4aac-8ceb-c9ca163a0214');
...
my INSERT query
\endif
Я обновляю свою стратегию без точек сохранения - если запрос SELECT возвращает TRUE
, я оцениваю все вставки. Каким образом я выполняю запрос, только в командной строке? При попытке в console.sql в DataGRIP выдает ошибку - честно выполняет все строки и терпит неудачу в INSERT INTO DPoint (uuid)...
если точка уже существует. Я хотел бы выполнить операторы одним способом