2014-01-11 3 views
0

У меня есть интересная ситуация, когда я постоянно обрабатываю данные с сервера. Я не контролирую контент, который он предоставляет, поэтому мне просто нужно иметь дело с тем, что он мне дает.Храните базу данных MySQL в синхронизации с данными опроса

Я регистрирую часть информации, которую он предоставляет, и сохраняя ее в базе данных MySQL. Это не проблема, однако моя проблема заключается в том, как эффективно синхронизировать данные с базой данных.

Например, в какой-то момент у меня могло бы быть 3 идентификатора 1001, 1002, 1003. Я могу вставить их в базу данных просто отлично, однако что, если у меня теперь есть 1001 и 1003. Что было бы самым эффективным способом обновить базу данных, чтобы это отразить? В принципе, я знаю только то, что у меня есть СЕЙЧАС, и у меня нет способа узнать, что изменилось, не вычисляя это на PHP.

Я полагаю, что могу выбрать, найти разницу, а затем выдавать DELETE/INSERT для потерянных/добавленных идентификаторов. Или, возможно, DELETE NOT IN(), а затем INSERT .. но поскольку этот скрипт работает все время, я боюсь, что это будет не очень эффективно.

Еще одна мысль, которую я имел, заключалась в том, чтобы сделать одну строку на «игрока» с разделенным CSV списком идентификаторов. На каждой итерации я мог бы ОБНОВИТЬ строку для этого игрока, а не SELECT/DELETE/INSERT.

Кто-нибудь сталкивался с подобной проблемой и нашел хорошее решение или имел некоторое представление? Буду весьма признателен за это! Я использую PHP.

+0

Если вы хотите заменить существующие данные с последними полученными с сервера, почему бы не очистить все, что в настоящее время хранится, а затем вставить то, что было получено? – eggyal

+0

Удалить все строки из одного игрока и вставить текущие данные? Насколько это было бы эффективно, также учитывая, что мне нужно получить доступ к этой информации из других сценариев. В почти всех случаях у одного игрока не было строк, и это было бы неверно. –

+0

Выполняйте обе операции (DELETE, затем INSERT) внутри транзакции: другие сеансы будут воспринимать ее как атомарную. – eggyal

ответ

0

Возможно, вы можете попробовать REPLACE INTO, если я получу то, что вы просите.

http://www.mysqltutorial.org/mysql-replace.aspx

Если отчет, который вы хотите вставить не существует, то MySQL REPLACE вставляет новую запись.

Если запись, которую вы хотите вставить, уже существует, MySQL REPLACE сначала удаляет старую запись, а затем вставляет новую запись.

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

+0

Мне необязательно ЗАМЕНИТЬ информацию, которая уже существует. Я больше заинтересован в эффективном удалении строк, которые больше не существуют в моих исходных данных и вставки новых строк. –

+0

О, извините, позвольте мне лучше объяснить. Мне не нужно удалять текущие строки, если они больше не существуют в моих исходных данных. Заменить здесь не подходит, так как он заменит ту же информацию. –

+0

О, хорошо, неправильно поняли. –

0

Если вы можете позволить себе обрезать всю таблицу и загрузить ее снова, вы можете это сделать.

ИЛИ

Создать временную таблицу с новыми данными, загруженными в него

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

ИЛИ

Используя язык программирования, определите идентификаторы, которые больше не должны существовать в исходной таблице и удалите их.

Смежные вопросы