【问题标题】:MySQL: can an AUTO_INCREMENT generate values out of order?MySQL:AUTO_INCREMENT 可以乱序生成值吗?
【发布时间】:2012-01-27 15:25:48
【问题描述】:

假设我有桌子:

CREATE TABLE test (
    ID INT AUTO_INCREMENT PRIMARY KEY,
    InsertTime DATETIME
) ENGINE = InnoDB;

并且,通过一个 Apache/PHP 网站,作为对网络请求的响应,我继续这样做:

INSERT INTO test (InsertTime) values (NOW());

假设如果row1.ID > row2.ID 那么row1.InsertTime >= row2.InsertTime 是否安全?或者可能是由于一些不幸的因素组合(复制环境中的多 CPU 服务器,木星的卫星正确对齐等),这可能会失败?

注意:我没有任何问题。我正在编写一个新软件,我想知道我是否可以依靠ID 排序也可以按日期排序(只有NOW() 甚至会插入到该列中)。

【问题讨论】:

  • 这似乎不是一个问题,而是一个讨论,所以 -> 对于 SE 程序员来说还有更多的东西吗?对于他的记录,我看不出这怎么会失败。
  • @saratis - 不明白这是怎么讨论的?这是一个具体的问题。要么 100% 保证有效,要么无效。
  • 虽然我猜这里有两个不同的问题。 “是否可以根据插入顺序生成 Id”和“该顺序是否无法匹配日期时间列的顺序?”
  • 如果没有第一个条件,第二个条件还能存在吗?

标签: mysql auto-increment


【解决方案1】:

我认为由于 DST(当然,这取决于服务器设置),您每年都会遇到一些不一致的情况。除此之外,我不明白为什么它会失败。

【讨论】:

  • 除非您使用字符串比较而不是日期比较,否则 DST 不会导致日期顺序的更改。时间戳在后台存储为 UTC。 MySQL 知道 UTC-7 中的 8:00pm 小于 UTC-8 中的 7:01PM。
  • 在上面的示例中,我使用 MySQL 的 datetime 类型,它不使用 UTC 或任何类型的时间戳。相反,它将日期存储为字符串(嗯,几乎)。这就是您可以实现所有这些无效日期的方法,例如00-00-0000。它也没有说明时区,所以我必须自己跟踪。总而言之,我想 TIMESTAMP 会是一个更好的选择。
  • 哦,这也意味着由于 DST,在转换过程中可能会出现时间混乱。避免使用该数据类型的另一个原因。
【解决方案2】:

如果有人手动重置桌子上的 auto_increment 是可能的。

【讨论】:

  • 这不是正常操作的一部分。您也可以输入手动日期而不是NOW()。显然,如果你这样做,所有的赌注都没有了。
【解决方案3】:

我认为大多数问题将来自对 NOW() 的调用,而不是 AUTO_INCREMENT。我怀疑大多数计算机在某些时候打印 NOW() 日期不正常!这通常是因为系统管理员更改了时钟,或者因为 NTP 更改了时钟。

【讨论】:

  • 哇,我没想到NTP。现在太明显了!这也意味着对我的 ID 进行排序不仅是可能的——强烈推荐!因为这是确保记录按插入顺序检索的唯一方法。
【解决方案4】:

据我所知,自动增量 ID 永远不会以错误的顺序返回记录。但是,在按 ID 订购时,您还需要注意另一种情况。

如果您的客户端保留稍后要插入的记录,那么在读取记录时,它们将不会按照创建的顺序被读取。我已经多次遇到这种情况,例如,在为具有间歇性网络访问的移动应用程序构建客户端时。

【讨论】:

  • 有趣,虽然不是我的情况。无论如何都值得点赞。 :)
【解决方案5】:

是的,删除 auto_increment 列,然后重新创建一个新列。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2021-10-03
  • 1970-01-01
  • 1970-01-01
  • 2012-08-02
  • 2011-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多