php - 在将数据插入数据库表之前检查重复
问题描述
我在检查 Laravel 中的数据库时遇到了一些麻烦。我已经抓取数据并将其插入数据库。但在插入进度之前。我想检查是否有任何相同的数据(例如相同的 url)。如果有相同的网址。然后避免插入该数据。
到目前为止我所做的就在下面。
$i = 0;
$database = [];
foreach($placeUrls as $k => $urls) {
$database = [
"place_id" => $k,
"website" => "a-site",
"place_name" => $names[$k],
"url" => $urls,
];
if ($plan = Plan::where("url", "=", $urls)->first()) {
if ($plan->url != $database["url"]) {
$this->line("plan inserted");
Plan::insertGetId($database);
}
}
$i++;
}
但检查部分不正确。我该如何解决?
解决方案
Scrapers 和 crawler 是非常消耗资源的应用程序,因此我更愿意避免在插入之前检查相同 URL 的额外 DB 选择交互。
在我的简单爬虫中,我在URLs
包含 URL哈希的表中添加了一个列,并在该列上添加了UNIQUE
索引。
ALTER TABLE urls ADD COLUMN url_hash char(32) NOT NULL UNIQUE
你可以用一些快速的算法来散列 url,比如MD5
算法
$hash = md5($method . $domain . $url);
您也可以使用此选项进行散列
这将允许您插入您收集的每个 URL,而无需先从数据库中选择它,并让数据库在较低级别处理唯一性问题。
警告:以后不要更改创建哈希的方式,否则您将以许多重复的 url 结尾
推荐阅读
- python - 在排序一个列表期间将不同列表中的相关元素保持在一起
- c# - 如何对通用列表对象进行排序
- javascript - 向和从 js 服务器发送数据的基本方法?
- json - 使用 Pyspark 处理 JSON 结构
- amazon-web-services - 为什么角色假设应该在 lambda 内部完成?
- html - 如何将数值绑定到 CSS 以创建时间线?
- docker - 如何为 docker compose 环境变量设置运行时变量
- javascript - 仅在 Javascript 中具有不同段落的动态 Div
- tsql - 表格模型中的测量列未在浏览器中显示正确的值
- javascript - 调用此函数时如何获取返回值?