由于DBs do not reuse numbers of deleted records可能会用完数字,特别是如果你选择的不是这个列的大整数类型。
会发生什么以及如果不好会如何预防?
// SQL Server,MySQL //
答案 0 :(得分:9)
最终会有3个多小时的停机时间,就像Slashdot在评论功能上所做的那样。
答案 1 :(得分:4)
我认为究竟发生了什么将取决于您正在使用的数据库引擎(在MySQL中甚至可能存在INNODB和MyISAM之间的差异)。 无论发生什么,它都不会很漂亮。
您只需将列类型更改为更大的整数。
答案 2 :(得分:2)
For MySQL, it is documented that:
如果用户为列指定负值或者该值大于可以存储在指定整数类型中的最大整数,则不会定义自动增量机制的行为。
答案 3 :(得分:2)
大多数数据库系统的数值数据类型都可以超过32位。如果您预计有超过2 ^ 32条记录,则应使用适当的密钥宽度。
答案 4 :(得分:1)
是的,有可能:如果您只允许2位数字,则最多只能有99个ID,依此类推。一旦达到限制,插入就会失败。选择合适的尺寸是常识。
答案 5 :(得分:1)
在Postgres中,“serial”类型相当于使用NO CYCLE选项创建SEQUENCE,并将字段的默认值设置为nextval。耗尽这样的序列会产生错误:
http://www.postgresql.org/docs/8.3/interactive/sql-createsequence.html
答案 6 :(得分:1)
这取决于您的数据库,我相信在MS SqlServer中,在修复问题之前,您根本无法插入任何新行。我最后一次遇到它时,我们通过将identity列重新设置为1来解决问题。这显然不是一个通用修复,但我们的情况还可以。
答案 7 :(得分:0)
Oracle不支持自动增量ID列,标准做法是使用序列生成器。一个序列生成最多28位的整数,所以如果你用完了那些...我猜你有一个非常大的表。但是行为将依赖于序列生成器的配置 - 要么是错误,要么它会循环回到起始值,并且您将在下一个插入时获得PK约束违规。
答案 8 :(得分:0)
我前一段时间在SQL 2000中试过这个。在Integer.MaxValue之后,下一个标识值是Integer.MinValue。然后它会按照您的预期继续计数。只要曾经存在于1,2,3等处的记录在它到达那里时已经消失,就不会发生任何不好的事情。如果它遇到重复(并且该字段是主键),则插入失败并发生密钥违规。我没有尝试过不受限于唯一值的标识列。我猜它会对副本感到满意。
答案 9 :(得分:0)
通常你会收到错误。如果你是偏执狂,请使用BIGINT。