【问题标题】:Auto increment jumps over ids自动增量跳过 id
【发布时间】:2015-07-05 05:15:48
【问题描述】:

我创建了一个抓取脚本,它每小时都会浏览不同的文章并将它们添加到数据库中。然而,在这个数据库表中,我在日期和标题上设置了唯一键,所以它不会一遍又一遍地添加相同的文章。然而,这似乎是一个奇怪的效果,即使没有添加新闻,新闻自动增量 id 上的 id 似乎也会增加?我该如何解决这个问题?

$insert_news = $con->prepare("INSERT IGNORE INTO news (`title`, `url`, `image_url`, `date`, `news_text`, `website_id`) VALUES (?, ?, ?, ?, ?, 2)");
$insert_news->bind_param("sssss", $hltv_title, $hltv_link, $hltv_img, $hltv_date, $full_text_dont);
$insert_news->execute();

【问题讨论】:

  • 当插入失败时,auto_increment 被丢弃。 MySQL 实际上尝试使用它,但失败了,然后忘记了数字(简单地说)。即使它看起来很糟糕或违反直觉,它实际上是想要的。数据库在并发环境中工作,这个数字“下降”是有原因的。基本上你无法修复它,因为auto_increment 不提供序列号。它只是提供下一个更高的数字。如果你保持原样,不会有任何不好的事情发生。

标签: php mysql


【解决方案1】:

INSERT IGNORE increases auto increment counter even no record is added?prevent autoincrement on MYSQL duplicate insert 可能重复。如果您想防止自动递增的 ID 出现空白,您应该考虑更改逻辑。例如,在尝试插入之前首先检查记录是否存在(使用 SELECT 查询)。

【讨论】:

  • 一开始我是这样做的,但是这里的另一个人告诉我以前进行选择查询是不好的做法?
  • 如果我删除忽略会发生什么?
  • 在插入之前永远不要检查记录是否存在。这是你能做的最糟糕的事情。始终插入,如果插入失败 - 瞧,您只是防止了重复。不要试图避免自动增量 ID 中的间隙,当真正非常奇怪的事情开始发生时,它只会导致一个痛苦、混乱和普遍 WTF 的世界。
  • 我能想到不这样做的唯一原因是因为并发问题(INSERT IGNORE 是原子的,SELECT + INSERT 不是)。但是,这也可以在代码中处理(锁、信号量、互斥锁),并且在插入失败时首先检查是否允许某些内容而不是依赖错误感觉更自然。也许你可以解释为什么检查是你能做的最糟糕的事情? (但我同意你不应该试图避免自动递增 id 中的间隙,仅仅因为间隙不是问题。)
  • 数据库负责数据,它也是整个通信链中最快的可以检测重复的系统。即使它“感觉”很自然,如果您选择首先检查是否存在某些东西,那么使用锁和其他东西不仅仅是将权限从数据库委托给编程语言。但是系统已经到位 - 通过unique 防止数据库级别的重复,然后插入。您避免使用锁,避免误报(由于并发性)并且生成更少的代码。你得到所有的好处与 0 缺点。无需无缘无故地让代码变得复杂。
猜你喜欢
  • 2012-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-03
  • 2011-08-04
  • 2011-07-03
  • 2018-04-11
  • 1970-01-01
相关资源
最近更新 更多