MySQL-mysql数据添加与更新的双字段唯一条件的判断

MySQL-mysql数据添加与更新的双字段唯一条件的判断

甜柠檬 发布于 2017-07-12 字数 1245 浏览 1297 回复 4

先看表结构请输入图片描述

字段说明:
id 主键ID
aid 软件ID
downdate 当天日期
downcount 当天下载量
目的很简单,就是当符合aid =$aid and downdate = $downdate的数据更新成功时,就自增1,失败就添加,但是现在出现了这样的情况
请输入图片描述

本来可以是符合同一AID和同一天的数据应该在数据表只有一条

现在不知道那里出了问题,有的时候就像上面的,会出现很多条,很纠结啊,跪求解决办法啊!!!!!!!!!!!
最后补充一下:我也已经建立了aid和downdate的唯一索引,
请输入图片描述
再补充个我的粗浅逻辑:
//当天日期

$downdate = strtotime(date('Ymd'));
if($aid!=0) {//aid
mysql_query("UPDATE `test` SET `downcount` = `downcount`+1 WHERE `aid` =$aid and `downdate` = $downdate");
$upsta = mysql_affected_rows();
if($upsta==0) {
$DB->query("INSERT INTO `test` (`aid`,`downdate`,`downcount`)VALUES ('$aid', '$downdate',1)");
}
}

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

瑾兮 2017-11-08 4 楼

应该是mysql_affected_rows()这个函数的问题,手册上是这么说的

 执行成功则返回受影响的行的数目,如果最近一次查询失败的话,函数返回 -1。

如果最近一次操作是没有任何条件(WHERE)的 DELETE 查询,在表中所有的记录都会被删除,但本函数返回值在 4.1.2 版之前都为 0。

当使用 UPDATE 查询,MySQL 不会将原值和新值一样的列更新。这样使得 mysql_affected_rows() 函数返回值不一定就是查询条件所符合的记录数,只有真正被修改的记录数才会被返回。

还有你没有建立“aid和downdate”的联合唯一索引,只是针对各自加上了索引而已

虐人心 2017-11-03 3 楼

aid 软件 ID
downdate 当天日期

这2个都是int形式,组合建立联合唯一索引。还有不知道你更新 downcount 当天下载量的sql是咋写的!

update 的时候,最好不要用 mysql_affected_rows 来判断是否 update 成功;通常先 select count(1),来判断是否存在,然后 update 或 insert

刚才看了下面的评论,你可以这样修改,不改表结构的话用 select id 判断是否存在,要不修改表结构,去掉 id,把 aid 和 downdate 建立唯一性索引

泛泛之交 2017-10-27 2 楼

很可能 这句sql :

UPDATE test SET downcount = downcount+1  WHERE aid =$aid and downdate = $downdate"

执行失败,mysql_affected_rows() 返回 -1

既然有了联合唯一索引 那么可以用下面一句sql代替php判断逻辑

INSERT INTO test(`aid`,`downdate`,`downcount`) VALUES(12,...) ON DUPLICATE KEY UPDATE downcount = downcount+1

还有,你的 联合唯一索引 是否存在,从你的数据上来看,那么多重复的数据,肯定没起作用,
你建立唯一索引是否是 以下sql :

CREATE UNIQUE INDEX IDIndex ON test(aid,downdate);

或者是你部署到线上的时候,数据库是否忘记修改。
数据已经有重复,再建唯一索引会报错的,是不是建立的时候没注意看,以为建立成功了呢?如果有联合唯一索引,即使是执行了insert,那样的数据也不会成功入库的。

虐人心 2017-08-21 1 楼

aid和downdate一定不是唯一索引。