2016-03-19 5 views
2

У меня есть таблица, которая получает новые данные каждые несколько секунд. Рассмотрим мой стол ПРОДУКТ:Избегать повторных данных для определенного времени Интервал

+----+-------------+--------+--------------------------------+-------+--------+---------------------+ 
| id | business_id | name | description     | link | status | created_at   | 
+----+-------------+--------+--------------------------------+-------+--------+---------------------+ 
| 1 | 12   | qwerty | Description for product qwerty | zxcvb | 1  | 2015-12-07 23:49:33 | 
+----+-------------+--------+--------------------------------+-------+--------+---------------------+ 
| 2 | 12   | abcde | Description for product abcde | mnopq | 0  | 2015-12-07 23:49:33 | 
+----+-------------+--------+--------------------------------+-------+--------+---------------------+ 

Значения в столбцах имя и описание являются уникальными (я не уверен, что это правильно).

Условие, которое я хочу: если новые данные совпадают с последними вставленными данными, но метка времени больше 5 минут, то выполните обновление или добавьте новую строку в таблицу. Хотя имя и описание являются уникальными.

Query Я попытался:

INSERT INTO product(business_id, name, description, link) 
VALUES ('$business_id' ,'$product_name','$product_description', '$short') 
ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id) 

Какое условие я должен изменить? Должен ли я удалять уникальные ключи?

ответ

1

Вы хотите вставить дубликат имя и описание значения, когда их штамп времени не более чем на 5 минут позже, чем у последней вставленной записи.

С этим требованием вам эффективно сказать, что имя и описание является не уникальными. Поэтому, действительно, вам придется отбросить ключ или индекс unique в этих полях, чтобы сделать это возможным.

Во-вторых, вы предполагаете, что если новые значения уже существуют в таблице, это должно быть по последней вставленной записи, но, похоже, для этого нет никакой гарантии. Вы также должны иметь дело с возможностью вставки первых значений A, затем значений B через минуту, а затем значения A снова через 10 минут.

В представленной вами логике последняя операция будет обнаружена как дубликат и будет переведена в обновление последней вставленной записи. Но это не было запись со значениями A. Фактически, предложение ON DUPLICATE, которое вы предлагаете, создало бы в этом случае его собственную копию (дубликат на id).

Так вот что я хотел бы предложить, чтобы сделать:

Отбросьте UNIQUE ключ/индекс на имя и описание, но вы можете все еще извлечь выгоду от использования без уникальных индексов;

Используйте следующую INSERT заявление:

INSERT INTO product(business_id, name, description, link) 
SELECT :business_id, :name, :description, :link 
FROM product 
WHERE NOT ( name = :name 
      AND description = :description 
      AND created_on < DATE_ADD(NOW(), INTERVAL -5 MINUTE) 
     ) 

В : обозначают держатели места для аргументов в подготовленном заявлении.Вы должны не вставлять строки внутри операторов SQL, как вы, потому что тогда вы уязвимы для SQL injection. Читайте о converting your code to use prepared statements.

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

В этом случае вы можете проверить на PHP, что запись не была вставлена ​​с помощью метода num_rows. Если возвращает 0, то вы бы выполнить второй SQL для выполнения обновления:

UPDATE product 
SET link = :link 
WHERE name = :name 
    AND description = :description 
    AND created_on < DATE_ADD(NOW(), INTERVAL -5 MINUTE) 

Опять же, вы должны сделать это с помощью заранее подготовленных заявлений.

0

Если вы используете описание как уникальное, вы не можете вставить новую запись с тем же описанием. Уникальный должен использовать на «id», поэтому да, вы должны удалить уникальное описание.

И вы можете использовать опцию if, чтобы проверить, если business_id, если он такой же, и create_at больше 5 минут, затем обновите или вставьте новую строку.

+0

ID должен быть первичным, поэтому по определению уникальный. Название, безусловно, может быть уникальным, но кажется маловероятным или ненужным, чтобы описание было - хотя и немыслимым. Здесь нет необходимости в условии if. На самом деле это было бы контрпродуктивно. – Strawberry

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