MYSQL数据库,老是被插入重复记录,怎么解决?(附代码)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MYSQL数据库,老是被插入重复记录,怎么解决?(附代码)相关的知识,希望对你有一定的参考价值。

本程序是站内搜索记录的插入,也设置了刷新时间,可是在同一时间内,老是被重复插入很多记录,不知道是不是用户搜索慢,使劲刷新导致的,我自己测试,也没出现重复N多记录啊,下面是代码,我也判断了重复,但是还是有重复。
$query = $DB->query("SELECT COUNT(*) FROM 表 WHERE keyword='".$keyword."'");
$total = $DB->result($query, 0);
if($total <= 0)
$DB->query("INSERT INTO 表 (keyword) VALUES ('".$keyword."');
else
$DB->unbuffered_query("UPDATE 表 SET count=count+1 WHERE keyword='".$keyword."'");

请给出具体代码哦,分不够可以加,谢谢

数据库服务器执行的单位是“事务”,你应该把上述动作包装成一个事务,在事务的开头用lock table把表加锁,最后在解锁。追问

能否给出具体代码哦?还有就是这个站内搜索,同时又很多人搜索,如果锁定了表,对其他用户使用会不会有影响啊?

追答

把下面的串(多行)作为unbuffered_query的参数,需要注意的是关于锁表和解锁的语法,不同数据库是有差别的,你应该查一下手册。
begin transaction
lock table 表
if ( select count(*) from 表 where keyword = '".$keyword."' ) = 0
INSERT INTO 表 (keyword) VALUES ('".$keyword."')
else
UPDATE 表 SET count=count+1 WHERE keyword='".$keyword."'
unlock table 表
commit transaction

追问

同时又很多人搜索,如果锁定了表,对其他用户使用会不会有影响啊?

追答

事务一旦执行完毕,就释放锁,可以接受其他用户的访问,理论上没有影响,因为逻辑的正确你还是要保证的。实际上应该会有些影响,但为了保证多用户的流畅体验,应通过提高服务器配置来达到,关注服务器的事务处理性能。

追问

你给的代码我能直接用么?好像是不是php文件里能执行的

追答

我不会PHP,意思是就执行一条命令,用数据库的事务机制解决你的问题。这个命令比较长,准确地说,是执行一个批,事务控制当然不会是简单的一条命令了。

参考技术A 1、可以设置执行时间,用cookie记录时间,比如1分钟之内只操作一次插入数据
2、在执行插入数据之前,先查询一下数据库中是否有相同的记录,如果有不执行,如果没有再执行
3、通过事务来控制追问

1和3能否给出代码啊?

我使用就是第2种方法啊

参考技术B 应该就是刷新造成的,添加事物处理就好了 参考技术C 设定字段keyword为唯一追问

此话怎讲?

追答

当你设定成唯一,那样就无法再插入一个具有相同keyword数据到表中,即使执行插入动作,也是无法保存数据

追问

怎么设定唯一呢?求教,给出代码

追答

点击图片上面那个大写红色 “U”就行

追问

你发的图片是PHPMYADMIN的吧?我没装这个,直接用的Navicat for mysql

追答

ALTER TABLE 表 ADD UNIQUE (
`keyword`
)

以上是关于MYSQL数据库,老是被插入重复记录,怎么解决?(附代码)的主要内容,如果未能解决你的问题,请参考以下文章

面试官:MySQL的幻读是怎么被解决的?

Mysql中 unique列插入重复值该怎么解决呢

MySQL 当记录不存在时插入(insert if not exists)

向数据库里插入大量数据,怎么实现不插入重复的记录

MySQL数据库学习补充mysql老是停止运行该怎么解决

mysql 处理数据库中的重复行