-1

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

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

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

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

1 回答 1

2

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

BIGINT UNSIGNED如果您要快速增加自动增量,我建议您使用 a 。假设您在每个 INSERT 上将值增加 1,那么您将不会在您的生命周期中用完值。

算一算。

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

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

您需要继续以该速率将数据插入该表 5,850 年才能填满主键。

如果您仍然想设计您的应用程序以在达到最大 id 时覆盖记录,请随意,但您不能使用 MySQL 自动增量功能来做到这一点。您将不得不以其他方式生成 id 值。

于 2021-01-10T19:49:05.337 回答