Mysql:如果行不安全且具有键和唯一属性

时间:2019-02-15 11:57:02

标签: mysql sql mysql-connector-python

背景:

我在python中构建了一个刮板(不确定是否重要)。我抓取网站并更新了html表。主表存储自动生成的ID,URL,raw_html,date_it_was_scrapped,last_date_the_page_was_updated(由网站提供)。我的表中有许多重复的URL,这是不应该的,因此我计划使URL在数据库中唯一。

所需结果:

如果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

问题:

有什么不安全的方法吗?

1 个答案:

答案 0 :(得分:1)

description of bug 58637(在MySQL文档页面链接)中,该页面将#include <limits.h> #include <stdio.h> const int a = INT_MAX - 2; const int b = INT_MAX - 2; printf("%d + %d = %d\n", a, b, a + b); 标记为不安全:

  

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

我了解您的表具有自动递增的主键,并且您计划在url列上添加唯一键。因为主键是自动递增的,所以您不会将其作为INSERT ... ON DUPLICATE KEY UPDATE命令的参数传递,如SQL命令所示。因此,MySQL将不需要在此列上检查重复项;它只会检查INSERT上的重复项。因此,此url应该是安全的。

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

  • 您不需要更新重复键上的INSERT命令(我们知道它是相同的)

  • 不清楚url子句在查询中的用途,确定要使用它吗?

  • 在对URL启用唯一约束之前,您将需要删除重复项。