4

有什么好的做法吗?

我希望当主键达到限制而不是避免它时,我可以解决问题。因为这是在我的具体问题中会发生的事情。

如果这是不可避免的......我该怎么办?

这是 mysql 的问题,是否有任何地方的 Sybase sql 相同的问题?

4

4 回答 4

3

你为什么要达到那个领域的极限?如果您使用足够大的数据类型定义它,它应该能够保存您的所有记录。

如果您使用未签名的 bigint,则最多可以有 18,446,744,073,709,551,615 条记录!

于 2009-11-03T12:08:02.800 回答
1

你应该为主键选择正确的类型,如果你知道你会有很多行,你可以使用 bigint 而不是常用的 int。

在 mysql 中,您可以使用 alter table 语句轻松调整主键列来调整范围。
您还应该在该列上使用 unsigned 属性,因为自动增量主键始终为正。

当达到限制时,您可以创建一些算法来放入INSERT的ON DUPLICATE KEY UPDATE语句中

于 2009-11-03T12:06:54.563 回答
0

好吧,取决于自动增量列的数据类型。
Unsign int 上升到 4294967295。

如果要防止错误,可以检查 value last autoincrement value:LAST_INSERT_ID()

如果它接近数据类型的最大值,则不允许插入或以其他方式处理它。

除此之外,我只能建议你使用 bigint,这样在大多数情况下你几乎不会达到最大值。

虽然不能给你一个万无一失的答案:)

于 2009-11-03T12:05:21.430 回答
0

我知道这个问题可能太老了,但我也想回答。

实际上不可能使这种情况不可避免。仅仅通过思考人类能够制造多少存储驱动器就存在物理限制。但这肯定不可能填满所有可用的存储空间。

正如其他人告诉你的那样,anUNSIGNED BIGINT能够处理最多18,446,744,073,709,551,615记录,这可能是“大多数”情况下的方式。

这是另一个想法:通过触发数据库的记录数(例如,85% 已满),您可以将该表备份到另一个表/区域/数据库中,并相应地扩展您的基础架构。然后重置该初始表。

我的最后一种方法:一些公司选择对其许可和使用协议进行微小的更改,如果用户在一定时间内没有登录,他们将关闭一个帐户(例如,免费用户 6 个月,6 年)对于专业用户,60 年对于最终用户... <-- 嘿!您也可以为这些用户使用不同的表!)。

希望有人觉得这很有用。

于 2019-04-20T13:27:58.557 回答