【发布时间】:2009-11-03 11:56:47
【问题描述】:
这方面有什么好的做法吗?
我希望我能在主键达到限制时解决问题,而 not 来避免它。因为这是在我的具体问题中会发生的事情。
如果这是不可避免的......我该怎么办?
这是mysql的问题,有没有Sybase sql一样的问题?
【问题讨论】:
标签: mysql limit auto-increment
这方面有什么好的做法吗?
我希望我能在主键达到限制时解决问题,而 not 来避免它。因为这是在我的具体问题中会发生的事情。
如果这是不可避免的......我该怎么办?
这是mysql的问题,有没有Sybase sql一样的问题?
【问题讨论】:
标签: mysql limit auto-increment
你为什么要达到那个领域的极限?如果您使用足够大的数据类型定义它,它应该能够保存您的所有记录。
如果您使用无符号 bigint,则最多可以有 18,446,744,073,709,551,615 条记录!
【讨论】:
你应该为主键选择正确的类型,如果你知道你会有很多行,你可以使用 bigint 而不是常用的 int。
在mysql中你可以很容易地用alter table语句调整主键列来调整范围。
您还应该在该列上使用 unsigned 属性,因为自动递增主键始终为正数。
当达到限制时,您可以创建一些算法来放入 INSERT 的 ON DUPLICATE KEY UPDATE 语句中
【讨论】:
嗯,取决于自动增量列的数据类型。
Unsign int 上升到 4294967295。
如果要防止出错,可以查看value last autoincrement value:LAST_INSERT_ID()
如果它接近数据类型的最大值,要么不允许插入,要么以其他方式处理。
除此之外,我只能建议你使用 bigint,这样在大多数情况下你几乎不会达到最大值。
虽然不能给你一个万无一失的答案:)
【讨论】:
我知道这个问题可能太老了,但我也想回答。
实际上不可能使这种情况不可避免。刚过 认为存储驱动器的数量存在物理限制 人类能够制造。但这肯定不太可能发生 填满所有可用的存储空间。
正如其他人告诉你的那样,UNSIGNED BIGINT 最多可以处理18,446,744,073,709,551,615 记录,这可能是“大多数” 情况下的方法。
这是另一个想法:通过触发数据库的记录数(例如,85% 已满),您可以将该表备份到另一个表/区域/数据库中,并相应地扩展您的基础架构。然后重置那个初始表。
我的最后一种方法是:一些公司选择对其许可和使用协议进行微小的更改,如果用户在一定时间内未登录(例如,免费用户 6 个月),他们将关闭帐户,专业用户 6 年,终极用户 60 年...
希望有人觉得这很有用。
【讨论】: