200分请高手帮忙!php程序采集动态js数据,最近常有重复记录入库,但程序本来有判断记录已存在就不插入

总哈哈 2008-03-27 04:56:12
表名为table1,主键id,auto_increment,这个应该没有问题。
一直这个采集程序都运行很好,每条记录都是唯一,就最近才有些数据有重复记录。
程序本来有判断如果记录已存在不插入,判断如果字段a,b,c相同即为相同的记录,不插入。
之前还有个采集进程条,发生重复事件后怀疑是进程条的原因,就把进程条删除了,可是结果还是一样。
被重复的记录没有任何规律或者特征,但是基本都是id隔得很近的,比如id为2222,2223,2224或者2222,2225这样.
所以个人猜测是不是我要采集的js数据在快速跳动?比如:有两条一模一样的数据插入库,因为时间很短也就几毫秒,在第一条插入还没有完成以前,第二条select没有查找到相同数据,也进行插入操作,结果库中就有两条一模一样的数据了。纯属个人猜测。

非常期待高手出来帮忙了!如果最后没有解决,就按照贡献大小分这200分吧,如果可以这样散分的话。




另外,本来想写个sql语句暂时删除这些重复的记录吧,可是却出错了,出错提示如下:
You can't specify target table 'table1' for update in FROM clause

sql语句如下:
delete from table1
where id in (
select table1.id from table1,(select min(id) as minid,a,b,c from table1
group by a, b,c) as table2
where table1.a = table2.a
AND table1.b = table2.b
AND table1.c = table2.c
AND table1.id <> table2.minid
)
不知道错在哪里?
...全文
246 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
guok110 2010-06-23
  • 打赏
  • 举报
回复
关注下答案
ten789 2008-03-29
  • 打赏
  • 举报
回复
多线程?
或者采集的时候把SQL语句集中在最后再执行插入 这样还省数据库资源呢
fxs_2008 2008-03-28
  • 打赏
  • 举报
回复
我是这样做的,比较笨的方法
做一个临时表,采集时读入临时表,采集后和备份表对比
将数据从备份表中提到数组,将临时表也提到数组,对比数组重复
将重复删除
将不重复处理完后读入备份表

gs6fox 2008-03-28
  • 打赏
  • 举报
回复
用锁表?插入的时候把表锁了
总哈哈 2008-03-28
  • 打赏
  • 举报
回复
不行的,重复的记录几乎是同一时间进去的,如果有延迟十几秒入库,那么程序里面已经有判断该记录存在就不入库,就不会存在重复记录的问题了。

[Quote=引用 2 楼 penglewen 的回复:]
如果是你猜想的那种情况,你在入库的时候延迟10秒或几秒看看就知道了.....

你的语句应该没有错的.
mssql删除重复的:
delete from table1
where id in (select min(id) from table1
group by a, b,c having count(*) > 1)
不知道mysql 有没有这种写法.
[/Quote]
总哈哈 2008-03-28
  • 打赏
  • 举报
回复
删除重复记录的sql语句已经执行成功,就是在每次采来新数据后执行一次:查询所有的记录,如果有重复记录就删除。
但这样还是有问题:
1.经常查询所有的记录并删除费时间,影响其他人的查询速度,毕竟数据库里面的记录已经太多,而速度在任何时刻都很重要;
2.主键id,auto_increment,id数值即为记录的条数,但执行删除语句后重复记录被删,有些id的数值就为空了。最后一个id并不是总的记录条数了。比如,本来是1,2,3,4,5,现在只剩下1,3,4,5

记录重复的问题根源还没有搞清楚,执行sql语句删除重复记录也只是亡羊补牢,希望各位高手继续畅所欲言,帮忙实现在采集的时候同样的记录就只有一条入库。谢谢。
fxs_2008 2008-03-27
  • 打赏
  • 举报
回复
楼上的说法或有道理,in得好象用于集合,一般为枚举型的
第二个关于重复的
一般不会重复,最大可能是你逻辑上有问题!
l9332019 2008-03-27
  • 打赏
  • 举报
回复
select table1.id from table1,(select min(id) as minid,a,b,c from table1
group by a, b,c) as table2
where table1.a = table2.a
AND table1.b = table2.b
AND table1.c = table2.c
AND table1.id <> table2.minid

这里返回的 能在iN里面实现嘛?
PleaseDoTellMeWhy 2008-03-27
  • 打赏
  • 举报
回复
你为什么不把a, b, c 三个字段合成一个字段,中间用|之类的字符区分开来,
然后把这个字段加上UNIQUE( 'FieldName' )属性?

读出的时候可以用list( $a, $b, $c ) = explode( '|', $FieldValue )来做呢?
myvicy 2008-03-27
  • 打赏
  • 举报
回复
给他们都用上别名试试。
penglewen 2008-03-27
  • 打赏
  • 举报
回复
如果是你猜想的那种情况,你在入库的时候延迟10秒或几秒看看就知道了.....

你的语句应该没有错的.
mssql删除重复的:
delete from table1
where id in (select min(id) from table1
group by a, b,c having count(*) > 1)
不知道mysql 有没有这种写法.

总哈哈 2008-03-27
  • 打赏
  • 举报
回复
如果解决问题,200分就只给一个人

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧