#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
, DMLDROP
илиTRUNCATE
. Но вы используете DMLDELETE
в своем коде, поэтому я просто предполагаю, что вы это имеете в виду. Однако он расположен перед циклом, поэтому он не будет выполняться после цикла.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. и таблица для управления фотографиями. Так что, возможно, там не будет фотографии, только одна или несколько, короче говоря, я смотрю на нее сегодня вечером. искренне вам большое спасибо!