我在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
有什么不安全的方法吗?
答案 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启用唯一约束之前,您将需要删除重复项。