gpt4 book ai didi

php - 避免特定时间间隔的重复数据

转载 作者:行者123 更新时间:2023-11-29 02:50:52 29 4
gpt4 key购买 nike

我有一个表格,每隔几秒就会获取新数据。考虑我的表 PRODUCT:

+----+-------------+--------+--------------------------------+-------+--------+---------------------+
| 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 |
+----+-------------+--------+--------------------------------+-------+--------+---------------------+

namedescription 列中的值是唯一的(我不确定这是正确的)。

我想要的条件:如果新数据与上次插入的数据相同但时间戳大于 5 分钟,则执行更新或在表中插入新行。尽管名称描述 是唯一的。

我试过的查询:

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)

我应该改变哪个条件?我应该删除唯一键吗?

最佳答案

您想插入重复的namedescription 值,当它们的时间戳比最后插入的记录晚不超过 5 分钟时。

根据此要求,您可以有效地说明名称描述 是唯一的。因此,实际上,您必须在这些字段上删除 unique 键/索引才能实现这一点。

其次,您假设如果新值已存在于表中,则它必须来自最后插入的记录,但似乎并不能保证这一点。您还应该处理这样的可能性,即首先插入值 A,然后在一分钟后插入值 B,然后在 10 分钟后再次插入值 A。

在您提供的逻辑中,最后一个操作将被检测为重复,并将转换为对最后插入的记录的更新。但这不是值 A 的记录。事实上,您建议的 ON DUPLICATE 子句在那种情况下会产生其自身的重复错误(在 id 上重复)。

所以我建议这样做:

UNIQUE 键/索引放在namedescription 上,但您仍然可以从使用非唯一索引中获益;

使用以下 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 .

如果 namedescription 值组合之前已经注册过,并且这种情况超过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)

同样,您应该使用准备好的语句来执行此操作。

关于php - 避免特定时间间隔的重复数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36098742/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com