我在python中构建了一个scraper(不确定是否重要)。我刮了网站并更新了我的html表。主表存储autogenerated_id,url,raw_html,date_it_was_scrapped,last_date_the_page_was_updated(由网站提供)。我的表有许多重复的网址,它不应该这样我计划在数据库中创建唯一的网址。
如果url不存在,我只想插入一行,如果last_date_the_page_was_updated> date_it_was_scrapped,则更新html。
以下stackoverflow post显示了如何。 我没有测试它,因为选择的答案警告:针对具有多个唯一或主键的表的INSERT ... ON DUPLICATE KEY UPDATE语句也被标记为不安全。
我计划根据stackoverflow问题做什么。
INSERT INTO html_table (url, raw_html, date_it_was_scrapped, last_date_the_page_was_updated)
VALUES (the data)
ON DUPLICATE KEY UPDATE
url = VALUES(url),
raw_html = VALUES(raw_html),
date_it_was_scrapped = VALUES(date_it_was_scrapped),
last_date_the_page_was_updated=VALUES(last_date_the_page_was_updated)
WHERE last_date_page_was_update > date_it_was_scrapped
有什么不安全的,有安全的方法吗?
来自description of bug 58637,它在MySQL文档页面中链接,将INSERT ... ON DUPLICATE KEY UPDATE
标记为不安全:
当表具有多个唯一键或主键时,此语句对存储引擎检查键的顺序很敏感。根据此顺序,存储引擎可以确定与mysql不同的行,因此mysql可以更新不同的行[...]存储引擎检查密钥的顺序不确定。
我知道您的表具有自动增量主键,并且您计划在URL列上添加唯一键。由于主键是自动增量的,因此不会将其作为INSERT
命令的参数传递,如SQL命令所示。因此,MySQL不需要检查此列上的重复项;它只会检查url
上的重复项。因此,这个INSERT
应该是安全的。
关于你的问题的其他评论。
url
命令(我们知道它是相同的)WHERE
子句的目的不清楚,你确定它是需要的吗?