2013-11-08 2 views
0

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

У меня есть таблица INNODB в базе данных MySql, которая получает непрерывный поток данных.

Таблица имеет составной индекс datetime-deviceID поле «данные» и поле «отравлены»

Я работаю над сценарием в PHP, что нужно сделать, чтобы:

  1. Выбрать все строки которые еще не отправлены (отправлено = 0). (php-запрос в MySQL)
  2. Сохраните выбранные столбцы в массиве PHP. (php)
  3. Сделайте преобразование на идентификаторе устройства (php)
  4. Отправьте строки с уникальной вставкой в ​​другую базу данных.
  5. Обновление с одной операцией все ранее выбранные строки (пункт 1) и обновить поле посланной от 0 до 1.

Моя проблема находится на точке 4, я не могу рисковать, что дополнительные данные прибывают между пункты 1 и 4, это приведет к потере данных, поскольку они никогда не будут отправляться в таблицу приемников.

Для того, чтобы я предположил, что нужно заблокировать стол до точки 1, пока все процедуры не закончатся, но я немного новичок в транзакции, и мне нужна помощь.

Я ищу этот код для достижения моих потребностей - правильно ли я?

START TRANSACTION; 
SELECT value FROM table WHERE sended = 0 FOR UPDATE; 
UPDATE table SET sended = 1 WHERE sended = 0; 
COMMIT; 

Смогу ли я в состоянии получить с помощью PHP столбцы выбранной формы операции выбора, или тот, на которые влияют на UPDATE и как я могу быть уверен, что столбец из выбора те же обновления?

+3

Я предлагаю вам добавить поле auto_increment в эту таблицу, поэтому на 4-м этапе вы можете установить 'update table set sended = 1 где ID в (...) и sended = 0' –

+0

@IlyaBursov Вы должны сделать ответ. Это не нужно автоматически увеличивать, но предложение IN - это путь. – Crashspeeder

ответ

0

Одним из возможных решений:

  1. добавить суррогатный первичный ключ таблицы, сделать его BigInt беззнаковое auto_increment (вы можете использовать UUID, но тогда вам нужно будет изменить операторы вставки или создать триггер)
  2. текущий ключ изменение начального до уникального индекса
  3. , если поле auto_increment вам не нужны никакие другие запросы SQL в этой таблице в вашей системе
  4. в данном сценарии вам нужно будет взять его в дополнение к текущ аренда колонны
  5. магазин этого идентификатор в отдельном массиве после отправки в другую БД
  6. на завершающем этапе вам нужно будет выполнить следующий запрос: $updateSQL = 'update table set sended=1 where ID in (' . implode(',',$sentIDs).') and sended=0'; - это обновит все записи только с соответствующими идентификаторами, и которые не были отправлены (на самом деле второе условие является необязательным, только моя привычка)
+0

Я попробую ваш метод, но есть ли способ сделать это с транзакциями? – groot

+0

@ пользователь2879565 вы можете использовать транзакции с этим методом, конечно –

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