覆盖mysql表数据
我有一个网络爬虫。网络爬虫收集我给它的网页的链接,但是当它检索链接时,由于网站的缘故,一些链接被复制。如果新行与旧行完全相同,那么MYSQL有没有办法覆盖数据?覆盖mysql表数据
说,如果我在一个链接字段
我也设法再次回升http://www.facebook.com有http://www.facebook.com,我想后者覆盖旧行。因此我的搜索引擎没有冲突。
考虑ON DUPLICATE KEY
行动
http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html
基本上让你担心了一个独特的键的列编写插入语句,然后添加
ON DUPLICATE KEY UPDATE col = overwriting value
我假设你想如果url
已存在,则更新last_updated
日期。否则没有好的理由去做更新。
INSERT INTO `scrapping_table`
(`url`)
VALUES
("www.facebook.com")
ON DUPLICATE KEY UPDATE
`date_updated` = `datetime.now()`
我有桌子,'网页',你可以解释一下更多 – 2012-08-16 17:54:01
所以你的'网页'表有一个列'url'存储'facebook.com'。现在您再次抓取网页,您的抓取工具再次找到“facebook.com”。现在更新'url'是一个多余的步骤,除非您可以通过存储执行此更新的'date'来存储关于此新爬网的更多元信息。 – 2012-08-16 18:04:55
在像Google这样的大型系统中,抓取可能需要几周时间,并且上次查看此url信息对于搜索算法非常有用,因此抓取工具不会继续浏览相同的url。稍微不同的是,谷歌使用“倒排索引”,这是建立全文搜索的好策略。 – 2012-08-16 18:06:53
如果您的链接域是唯一比你可以使用
INSERT INTO "mytable" (link_field, x_column, y_column) VALUES ("www.facebook.com",'something new for x','something new for y')
ON DUPLICATE KEY UPDATE x_column='something new for x', y_column='something new for y'
只要确保你的链接域是唯一的,如果你在你的列有更独特的领域,我建议使用,因为这第二个方法they建议避免在具有多个唯一索引的表上使用ON DUPLICATE KEY子句。
- 将您的链接字段设置为唯一。
-
之前插入一行尝试
Select "primary_id" from mytable where link_field="www.facebook.com"
-
从这个SQL计数返回的行数。
=>如果计数> 0,然后更新使用 “primary_id” 我们只是通过SELECT SQL
=>抓起行,如果count == 0,只需要插入你的行
谨防!!
同时经营一个网络爬虫,可能会发现数以百万计的 你希望尽量减少查询的每一个“爬行”过程火灾链接... 你想创建一个独特的联系表,将养活机器人?或者你想防止重复的搜索结果?
唯一的URL台球桌: - (!in_array())
- 在检索页面,你应该网址保存到一个数组(或列表),并确保了其独特的价值阵列,你会发现你爬行的每一页都包含很多重复的链接 - 所以在使用sql之前清理它们。
- 将网址转换为哈希值(32位数字的“simhash”[1,0])。
- 现在打开一个连接到数据库,并检查是否存在,如果它确实转储他们!不要更新(其进行第二个过程)。你应该在索引表上匹配使用散列的链接,这将更快。
防止重复结果搜索:
如果在上述方法编制索引的网址,你不应该查找重复的URL,如果你有,这意味着在你的爬行操作的问题。
即使您在另一个表中有重复的值,并且您想要搜索但没有返回重复结果,您可以在查询中使用DISTINCT。
祝你好运!
[有帮助?](http://*.com/questions/1218905/how-do-i-update-if-exists-insert-if-not-aka-upsert-or-merge-in-mysql) – 2012-08-16 17:44:45