Atomic [перейти к другой таблице, затем удалить исходные данные] - PullRequest
1 голос
/ 20 мая 2010

У меня есть таблица Data и таблица Archive .

Веб-приложение помещает данные в таблицу Data , а задание cron извлекает данные каждый час и архивирует их в таблицу Archive (при этом сохраняется Data столик маленький и быстрый для работы).

На мой взгляд, нужно выполнить два псевдо-SQL-запроса:

INSERT Archive SELECT * FROM Data;

&

DELETE FROM Data;

Однако я хочу удалить только те данные, которые были успешно скопированы, если копирование не удалось, я хочу, чтобы оно оставалось в согласованном состоянии, чтобы данные не были перемещены наполовину или удалены.

Какой правильный способ сделать это?

Ответы [ 2 ]

6 голосов
/ 20 мая 2010

С транзакцией.

start transaction;
insert into archive select * from data;
delete from data where primary_key in (select primary_key from archive);
commit;
1 голос
/ 20 мая 2010

Я рекомендую использовать синтаксис удаления нескольких таблиц и присоединиться к таблице архива для удаления. Таким образом, вы удаляете только те строки, которые находятся в обеих таблицах.

Простой пример:

insert into archive select * from data;
delete data.*
from data
inner join archive on archive.id = data.id;

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

insert into archive select * from data where id > 1000 and id <= 2000;
delete data.*
from data
inner join archive on archive.id = data.id
where data.id > 1000 and data.id <= 2000;

Из руководства: http://dev.mysql.com/doc/refman/5.1/en/delete.html

...