MySQL - предотвращение вставки записи, если идентификатор и временная метка уникальные комбо-ограничения в пределах таймфрейма - PullRequest
0 голосов
/ 24 января 2019

У меня есть сценарий, в котором 3 автономных агента сообщают о состоянии работоспособности для различных хостов.Если хосты отключаются и находятся в автономном режиме, должна быть создана запись простоя.К сожалению, поскольку агенты сообщают ровно в одно и то же время с одной и той же информацией, я видел повторяющиеся записи с интервалом в 1-2 секунды.

У меня есть уникальное ограничение, созданное для таблицы как для даты, так и для идентификатора хоста.Таким образом, они не могут быть одинаковыми.Но если запросы от агентов поступают в одно и то же время или через секунду, дубликат может быть создан, несмотря на проверку кода, ищущую существующую запись (в этом случае запись еще не была создана во всех трех случаях, еслиагенты отчитываются одновременно).Уникальное ограничение также не предотвратит дубликаты, так как datetime может быть на 1 секунду раньше или позже, когда вызов PHP / MySQL завершает обработку ...

Итак, как лучше всего справиться с этой ситуацией??Есть ли способ в MySQL, чтобы указать, что если уникальное ограничение (которое включает в себя поле даты и времени) находится в пределах определенного периода времени другой записи с уникальным ограничением, то не должно быть разрешено вставлять?

Мне нужно запустить задание, которое удаляет записи в течение нескольких секунд друг от друга, или есть ли способ заставить MySQL как-нибудь сделать это для меня?

Структура таблицы выглядит следующим образом

entry_idhost_id datetime

Записи могут быть

1 121 17.01.2009 02:38:04 AM

1 121 17.01.2009 02:38:05:00

1 121 17.01.2009 02:36:04

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

В моей таблице больше столбцов даты и времени, но они не нужны для понимания этой ситуации.Любая помощь приветствуется.

1 Ответ

0 голосов
/ 24 января 2019

Если вы используете MySQL 5.7 или новее, вы можете определить сгенерированный столбец, который содержит временную метку, округленную до диапазона 5 или 10 секунд.Затем вы можете определить уникальный индекс для этого столбца, так что вы получите нарушение ограничения, если попытаетесь создать две записи с метками времени за тот же период.

ALTER TABLE yourTable 
ADD datetime_10sec INT AS (10 * ROUND(UNIX_TIMESTAMP(datetime)/10)) PERSISTENT, 
ADD UNIQUE INDEX (host_id, datetime_10sec);

Измените обе 10 на любое времягранулярность, которую вы хотите использовать.

...