当主键到达顶部时,如何告诉 MySQL 重置主键增量?

问题描述

我每毫秒在数据库中存储大量数据。我被告知要这样做。 并且主键到顶就OK了,那么就可以重置并覆盖数据库中的当前行了。

是否可以在 MysqL 或 Spring Boot JPA 中设置主键,以便在主键 id 到达其顶部时自动重置

在本例中,我选择了 long 作为数据类型。但不确定它是否会保持并且足够好。这种策略是自动犯罪。

// ID
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;

解决方法

抱歉,MySQL 的自增机制设计为永远不会生成小于自增列中最大值的值。它不会覆盖现有值,甚至不会“填充”未使用的值。

如果您要快速增加自动增量,我建议您使用 BIGINT UNSIGNED。假设您在每次 INSERT 时将值加 1,那么您一生中都不会用完值。

做数学题。

假设您插入数据的速度足以使该表的自动增量每秒增加 100 万。所以你每天插入 100 万 * 3600 * 24 行。这在一年内达到 31,536,000,000 行(这已经超出了任何单个 MySQL 实例的容量)。

这将使用 BIGINT UNSIGNED 列范围的 0.00017%。 64 位整数上升到 18,446,744,073,709,551,615。

您需要在 5,850 年内继续以该速率向该表中插入数据以填充主键。

如果您仍然希望将应用程序设计为在达到最大 id 时覆盖记录,请随意,但您无法使用 MySQL 自动增量功能来实现。您必须以其他方式生成 id 值。