Сохранить результат запроса Select для последующего использования в файле sql PSQL - PullRequest
0 голосов
/ 31 декабря 2018

У меня есть база данных PostgreSQL.Я запускаю файл sql с помощью команды PSQL:

psql --dbname=postgresql://postgres:password@127.0.0.1:port/dbname < filename.sql

Мой файл sql выглядит так:

delete from records where id = 1;
delete from recordsinfo where recordsinfoid IN (select recordsinfoid from records where id = 1);

Но у меня есть зависимость от внешнего ключа:

'records' FOREIGN KEY (recordsinfoid) ССЫЛКИ recordsinfo (recordsinfoid)

Поэтому у меня не может быть подзапроса во втором операторе удаления, так как записи были бы удалены в первом операторе удаления.

Также я не могу поставить второй оператор удаления первым, потому что это приведет к нарушению внешнего ключа.

Как удалить все записи в recordsinfo, соответствующие подзапросу 'select recordsinfoid из записей, где id = 1'?

Ответы [ 4 ]

0 голосов
/ 31 декабря 2018

Я решил это с помощью:

DO $$
DECLARE
    recordsinfoids INTEGER[];
    i INTEGER;
BEGIN

    recordsinfoids := ARRAY(select recordsinfoid from records where id = 1);

    delete from records where id = 1;

    FOREACH i IN ARRAY recordsinfoids
    LOOP 
        delete from recordsinfo where recordsinfoid = i;
    END LOOP;

END $$; 

По существу, предварительно выберите значения в массиве, а затем удалите

0 голосов
/ 31 декабря 2018

Используйте курсор, чтобы извлечь записи из записей.создать строку, добавив записи infoid, разделив ','.сделать запрос на удаление, используя созданную строку, выполнить запрос, используя exec ()

Я использую mssql.

0 голосов
/ 31 декабря 2018

Использовать CTE для изменения данных:

with d as (
      delete from records
      where id = 1
      returning *
     )
delete from recordsinfo
    where recordsinfoid in (select recordsinfoid from d);
0 голосов
/ 31 декабря 2018

Использовать временную таблицу в качестве буфера записи:

create temp table tmp_records
as
select recordsinfoid from records where id = 1;

delete from records where id = 1;
delete from recordsinfo where recordsinfoid IN (select recordsinfoid from tmp_records);
...