php - 如何避免向 MySQL 中插入重复项?

标签 php mysql mysqli

我有一个分析平台,有很多用户和数百次插入点击/分钟。

有时我看到完全相同的点击在同一秒内被插入到数据库中,并且它变成了另一个的副本。

我有一个系统检查表是否具有相同的值,如果找到一个则不让另一个插入。

但是在这种情况下,在我看来它们是在完全相同的毫秒内插入到数据库中的。

我可以在这里做什么?

最佳答案

我最喜欢的:insert ignore myTable (col1, col2, ...) ...

预先设置唯一键以禁止插入。看起来您不太在意之前是否插入了它,就像您在意最终结果不是骗子一样。

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

关于 insert ignore 的警告:如果没有仔细考虑它对需要知道该行确实已经存在的敏感系统的影响,就不应该实现它。它非常适合“确保它在那里”。

选项 B:可以研究意向锁,例如 here ,但专为您的特定用例而设计。转向快速的 INNODB 行级锁定,当然不是表锁。大多数事情都需要权衡取舍。锁定的缺点是降低了并发性。

选项 C: 适合胆小的人(有时是我)。如果被雇用并且不希望以后受到同行的强烈反对,这就是我会做的。执行 Insert ... on Duplicate Key Update (IODKU),并有一个像 touches 这样的伪造列,它是一个你递增的整数IODKU 的更新部分。示例如下:

insert myTable (col1, col2, col3) values (p1,p2,p3) 
on duplicate key update touches=touches+1;

以上内容将采用最简约的形式。下面的 View 是我在 C# 中使用的 View ,其中我关心“IODKU 的更新部分”中的更多列,但只是为了表明这一点,如果它对任何人都有好处:

enter image description here

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

回到操作问题,您的系统可能已经有行的原因是由于没有锁定的高并发使用。

关于php - 如何避免向 MySQL 中插入重复项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38531506/

相关文章:

PHP 应用程序无法与某些 MYSQL 数据库通信

php - 使用 FPDF 时需要对齐顶部和环绕文本?

php - 在 while 循环中显示表格

php - jQuery 或 php 在单个节点内查找多个 html 字符串并用 span 括起来

php - Jquery Ajax从php mysql获取数据而不刷新页面 - 语法错误

php - mysqli php随机连接错误

php - 需要通过php文件更改mysqli_query输出格式

php - 如何在 PHP 中使用 Spreadsheet_Excel_Writer() 在 Excel 单元格中输出超过 255 个字符?

mysql - 如何用通配符比较同一张表中的2条记录?

java - Android 连接到 http 服务器 : Eclipse throws exception about localhost even though I state my online server?