在mysql单插入查询上重复数据

Posted

技术标签:

【中文标题】在mysql单插入查询上重复数据【英文标题】:Duplicates data on mysql single insert query 【发布时间】:2017-08-29 10:15:07 【问题描述】:

我已经创建了一个用户日志表

时间戳日期时间(3) 事件字符(25)

vartimestamp =date('Y-m-d H:i:s'). substr((string)microtime(), 1, 8);;
$varevent="loginattempt";
$stmt = $DBcon->prepare("INSERT INTO userlog(timestamp, event) VALUES('$vartimestamp', '$varevent')");

if($stmt->execute())
echo "Successful";
else    echo "Error";

我得到了成功的结果。 但是记录是重复的

第一次尝试

2017-04-04 14:59:02.007   loginattempt
2017-04-04 14:59:02.025   loginattempt

第二次尝试

2017-04-04 15:00:30.200   loginattempt
2017-04-04 15:00:30.218   loginattempt

如何在使用带索引的 datetime(3) 列时避免重复

 

【问题讨论】:

你可以看到时间戳不是重复的,每个条目都有不同的时间,对于“事件”,那么你已经写了你的$varevent有一个静态值,你为什么期待它改变吗? 没有问题是当查询被调用时它会重复记录。(例如 2017-04-04 14:59:02.007 和 2017-04-04 14:59:02.025 是单个查询执行. 我认为这是由于 datetime(3) 造成的问题,因为 datetime(0) 没有显示重复的结果。 这不是使用准备好的语句的方式 @MasivuyeCokile 我也试过 stmt->bindParam(":etimestamp", $vartimestamp) 。结果相同。 嗯... 18ms?我敢打赌你在 Windows 上的毫秒数实现很糟糕? 【参考方案1】:

你工作太辛苦了 - 跳过 php 代码,注意你可以在 mysql 中完成工作:

mysql> SELECT NOW(3);
+-------------------------+
| NOW(3)                  |
+-------------------------+
| 2017-04-04 10:13:06.862 |
+-------------------------+

所以,请使用INSERT ... VALUES (NOW(3), ...

除非字符串确实是固定宽度,否则不要使用CHAR;使用VARCHAR

回到代码中的真正 bug。每次从浏览器调用 PHP 脚本都会导致重新开始——因此您注定要获得一个新的日期时间,而您可以在 PHP 代码或 MySQL 代码中执行它。重新考虑您的设计。

另一方面,如果您说execute() 被执行了两次,那么我在您提供的有限代码段中看不到它。

我会猜测提供$DBcon 的软件包正在做一些顽皮的事情;深入研究。

【讨论】:

以上是关于在mysql单插入查询上重复数据的主要内容,如果未能解决你的问题,请参考以下文章

mysql 自动插入重复数据

自己动手丰衣足食,夜谈MySQL数据库去除重复记录最快的方法

mysql删除重复数据,保留一条

如果数据存在,则更新其他插入,使用子查询或等的mysql [重复]

mysql过滤重复数据的问题

mysql 添加数据判断是不是重复添加