gpt4 book ai didi

Mysql:如果行不安全地存在且具有键和唯一属性,则插入

转载 作者:行者123 更新时间:2023-11-29 07:24:17 25 4
gpt4 key购买 nike

背景:

我用 python 构建了一个抓取器(不确定这是否重要)。我抓取网站并更新我的 html 表。主表存储autogenerated_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 statement against a table having more than one unique or primary key is also marked as unsafe.

根据 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 标记为不安全:

When the table has more than one unique or primary key, this statement is sensitive to the order in which the storage engines checks the keys. Depending on this order, the storage engine may determine different rows to mysql, and hence mysql can update different rows [...] The order that the storage engine checks keys is not deterministic.

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

关于您的问题的其他说明。

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

  • 您的查询中 WHERE 子句的用途不明确,您确定需要它吗?

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

关于Mysql:如果行不安全地存在且具有键和唯一属性,则插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54708860/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com