В цикле postgres будет ли удаление фактически выполнено в конце цикла?

#sql #postgresql

Вопрос:

Мне нужно удалить таблицу, но я хочу, чтобы она была действительно удалена в конце цикла.

Не могли бы вы подтвердить, что если я закодирую таким образом, таблица действительно будет удалена в конце цикла?

 do $
    DECLARE
      _result_id integer; 
begin
delete toto;
    FOR _result_id  select id from tata order by id LOOP
insert into toto (id) value (_result_id);
end loop;
end;
$;
 

таблица tata содержит данные, полученные из CSV, с КОПИЕЙ. Эта таблица обновляется каждые 24 часа.

Поэтому я должен отсортировать и вставить данные в таблицу toto. Я хочу очистить таблицу toto и сделать новую вставку из tata в toto. Но я не хочу, чтобы toto был пустым, чтобы веб-сайт не возвращал какую-либо информацию.

Спасибо

Комментарии:

1. Данные в таблице будут находиться до цикла. И вам не нужна петля.

2. Именно, я хочу, чтобы данные были удалены после цикла. Это происходит в рамках лечения CSV. Поэтому я хочу удалить, вставить, но только в конце цикла, когда будет выполнено удаление и вставка

3. Неясно , подразумеваете ли вы под «удалить» DML DELETE , DML DROP или TRUNCATE . Но вы используете DML DELETE в своем коде, поэтому я просто предполагаю, что вы это имеете в виду. Однако он расположен перед циклом, поэтому он не будет выполняться после цикла. Deleting from toto` после цикла удалит все записи, вставленные в него в цикле. Так что в целом это кажется немного бессмысленным. Зачем вставлять и сразу же удалять после этого? Может быть, вы могли бы подробнее рассказать о том, что вы пытаетесь сделать, чтобы дать нам некоторый контекст, позволяющий нам давать лучшие ответы.

4. На самом деле я выполняю обработку данных, которые копирую в таблицу непосредственно перед этим. Затем я должен реорганизовать данные и вставить их в таблицу toto. Этот скрипт запускается каждые 24 часа. Поэтому я должен удалить старые данные, а затем вставить новые данные из таблицы tata. Но я не хочу, чтобы моя таблица toto была пустой, чтобы мой сайт не возвращал какие-либо данные …

5. Опубликуйте реальный код, нет (...) , пожалуйста!

Ответ №1:

Для этого вам не нужен PL/pgSQL или неэффективный цикл.

Просто оберните УДАЛЕНИЕ и ВСТАВКУ в одну транзакцию без PL/pgSQL

 begin transaction;
delete from toto;
insert into toto (id)
select id
from tata;
commit;
 

Поскольку это одна транзакция, изменения не будут видны другим транзакциям, пока вы не зафиксируете это. Если что-то не получится, транзакция будет откатана, в том числе DELETE и toto таблица будет выглядеть точно так же, как и раньше.

Комментарии:

1. пваоу, мне противно! Я боролся со своей петлей в течение 1 недели … Я и не думал о том, чтобы сделать это вот так !!! хорошо, я проверю это сегодня вечером! большое спасибо! но да, с транзакцией я уверен, что удаление будет выполнено только в том случае, если вставка прошла хорошо. это еще лучше! большое спасибо

2. Я забыл сказать, что у меня есть 5 csv-файлов, которые нужно связать вместе (то есть 5 копий или 5 таблиц), чтобы упорядочить данные в целом. но я думаю, что выбор с where должен работать

3. Запуск 5 insert into toto ... select from ... внутри этой транзакции. Или присоединяйтесь к этим 5 таблицам, что вам нужно сделать, чтобы объединить их

4. Я должен уехать, я пишу вам сегодня вечером. Да, идентификатор в 5 таблицах-это URL-адрес. В некоторых таблицах у меня есть дубликаты, поэтому я думаю, что лучше всего организовать 5 таблиц в 1 таблицу, чтобы сделать мою вставку правильно. Я также должен сгенерировать уникальный URL-адрес в соответствии с названием (это действительно рецепт).

5. и таблица для управления фотографиями. Так что, возможно, там не будет фотографии, только одна или несколько, короче говоря, я смотрю на нее сегодня вечером. искренне вам большое спасибо!