Php 如何避免在MySQL中插入重复项?

Php 如何避免在MySQL中插入重复项?,php,mysql,mysqli,Php,Mysql,Mysqli,我有一个分析平台,有很多用户,每分钟有数百次点击 有时我会看到,在同一秒钟内,完全相同的单击被插入到数据库中,并成为另一次单击的副本 我有一个系统,它检查表是否具有相同的值,如果发现一个值,则不允许插入另一个值 然而,在这种情况下,我认为它们以完全相同的毫秒插入数据库 我可以在这里做什么?我最喜欢的:插入忽略我的表(col1,col2,…)。 其中,唯一键预先设置,以禁止插入。看起来,您不太在乎它以前被插入,而只在乎最终结果不是重复 注意:唯一键可以是多列键(复合键) 关于insert igno

我有一个分析平台,有很多用户,每分钟有数百次点击

有时我会看到,在同一秒钟内,完全相同的单击被插入到数据库中,并成为另一次单击的副本

我有一个系统,它检查表是否具有相同的值,如果发现一个值,则不允许插入另一个值

然而,在这种情况下,我认为它们以完全相同的毫秒插入数据库


我可以在这里做什么?

我最喜欢的:
插入忽略我的表(col1,col2,…)。

其中,唯一键预先设置,以禁止插入。看起来,您不太在乎它以前被插入,而只在乎最终结果不是重复

注意:唯一键可以是多列键(复合键)

关于
insert ignore
的一点警告:如果不仔细考虑它对敏感系统的影响,就不应该实施它,因为敏感系统需要知道行确实已经存在。它是“确保它在那里”的理想选择

选项B:可以查看意图锁,例如,但它是为您的特定用例精心设计的。转向快速的INNODB行级锁,当然不是表锁。大多数事情都需要权衡。锁定的缺点是并发性降低

选项C:适用于虚弱的心脏病患者(有时是我)。如果我被录用了,我会这么做,我希望以后不会受到同行的反对。执行
插入。。。在重复键更新时(
IODKU
),并有一个伪列,如
touchs
,该列是一个整数,可以为IODKU的更新部分递增。示例如下:

insert myTable (col1, col2, col3) values (p1,p2,p3) 
on duplicate key update touches=touches+1;
以上所述将是最简单的形式。下面的一个视图是我在
C#
中使用的,我关心的是“IODKU的更新部分”中的更多列,但只是为了表明,如果它对任何人都有好处:

关于IODKU的最后一个想法是:必须有一个导致“冲突”发生的唯一键(primary或just unique)。因此,语句知道是否执行插入或更新。如果没有这种唯一的关键点碰撞,将插入新行


回到op问题,您的系统可能已经有行了,这是因为在没有锁定的情况下使用了高并发性。

如果系统的体系结构允许,我将创建两层解决方案。首先,将插入重复数据的临时表。临时表的名称可以包含分片参数,例如小时数。系统将定期将数据从临时表导出到主存储表中,丢弃重复数据。然后它可以丢弃临时表。

不要选中,然后插入。正如你所发现的,这取决于比赛条件。使用唯一的密钥。让DB强制执行唯一性您有2个选项,在数据库中有一个重复的密钥,并在重复密钥更新时使用,另一个选项是插入忽略,如果数据库中已经有,它将忽略它如果您正在记录单击,并且单击发生时,我想您会想知道有多少次,包括同时发生的那些。如果是这种情况,您可能需要插入一个单击计数,并让
ON DUPLICATE
子句增加该计数。