Mysql:使用key和unique属性安全地插入行

问题描述 投票:1回答:1

背景:

我在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

题:

有什么不安全的,有安全的方法吗?

mysql sql mysql-connector-python
1个回答
1
投票

来自description of bug 58637,它在MySQL文档页面中链接,将INSERT ... ON DUPLICATE KEY UPDATE标记为不安全:

当表具有多个唯一键或主键时,此语句对存储引擎检查键的顺序很敏感。根据此顺序,存储引擎可以确定与mysql不同的行,因此mysql可以更新不同的行[...]存储引擎检查密钥的顺序不确定。

我知道您的表具有自动增量主键,并且您计划在URL列上添加唯一键。由于主键是自动增量的,因此不会将其作为INSERT命令的参数传递,如SQL命令所示。因此,MySQL不需要检查此列上的重复项;它只会检查url上的重复项。因此,这个INSERT应该是安全的。

关于你的问题的其他评论。

  • 你不需要在重复键上更新url命令(我们知道它是相同的)
  • 你的查询中WHERE子句的目的不清楚,你确定它是需要的吗?
  • 在对URL启用唯一约束之前,您需要删除重复项。
© www.soinside.com 2019 - 2024. All rights reserved.