2012-04-22 2 views
1

Чтобы определить, как часто использовался какой-либо объект, я использую таблицу со следующими полями;Как правильно очистить таблицу

id - objectID - timestamp 

Каждый раз, когда используется объект, это ID и time() добавляются. Это позволяет мне определить, как часто объект использовался в последний час/минута/секунда и т.д.

После одного час, строка бесполезна (я не проверяю выше одного часа). Тем не менее, я понимаю, что неразумно просто удалять строку, потому что это может испортить первичный ключ (auto_increment ID).

Итак, я добавил поле под названием «active». Перед проверкой того, как часто использовался объект, я перебираю все WHERE active=1 и устанавливаю его в 0, если прошло более 1 часа. Я не думаю, что это создаст проблемы параллелизма между несколькими пользователями, но это оставляет мне много неиспользуемых данных.

Теперь я думаю, что, возможно, лучше всего до ввода новых данных использования проверить, есть ли поле с active=0, а затем вместо того, чтобы вставлять новую строку, обновлять ее с новыми данными и устанавливать активные к 1 снова. Однако для этого потребуется блокировка таблиц, чтобы предотвратить одновременное обновление нескольких клиентов.

Может ли кто-нибудь пролить свет на это, пожалуйста?

ответ

2

Я никогда не слышал нигде, что удаление строк помешает первичным ключам.

Возможно, вы пытаетесь обеспечить, чтобы значения id, автоматически назначаемые auto_increment, соответствовали значениям другой таблицы? Это необязательно - вы можете просто использовать INTEGER PRIMARY KEY в качестве столбца id и назначить значения явно.

+0

Как вы подразумеваете «присвоить значения явно»? – natli

+0

@MichaelSlade является правильным (+1 голос). Вы можете использовать 'objectID' как« Основной ключ »(без автоинкремента), чтобы убедиться, что у вас нет дубликатов. Вы можете удалить старые строки, потому что это не повлияет. Кроме того, вы можете использовать 'INSERT ON DUPLICATE KEY' (http://dev.mysql.com/doc/refman/5.6/en/insert-on-duplicate.html), чтобы обновить временную метку строки, если она уже существует. –

+0

@mazzucci Я думаю, что вы неправильно поняли, мне нужно * дублировать записи на объект ID. В конце концов, объект можно использовать несколько раз в час/минуту/секунду. – natli

1

Вы можете выполнить запрос на обновление, соответствующий всем строкам старше 1 часа.

UPDATE table SET active=0 WHERE timestamp < now() - interval 1 hour 
+0

Хорошее мышление! Почему я всегда все усложняю? Во всяком случае, есть шанс, что два клиента выберут одну и ту же строку? Или блокировка таблицы не нужна для одного запроса? – natli

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