2009-10-16 108 views
4

我有一个使用MySQL作为数据库后端的django应用程序。它已经运行了几天,而且我已经在一些表格中达到了ID 5000。当自动递增ID溢出时,MySQL会做什么?

我很担心溢出数据类型时会发生什么。

是否有反正告诉自动增量在某个点重新开始?我的数据非常不稳定,所以当我将ID溢出时,ID 0或任何靠近它的地方都没有可能的方式仍然在使用。

+0

当你运行ALTER TABLE来更改数据类型时,最终会出现3小时的停机时间:-) http://slashdot.org/articles/06/11 /09/1534204.shtml – 2009-10-17 00:04:13

+0

也看到这个问题:http://stackoverflow.com/questions/253616/ – 2009-10-17 00:04:55

回答

4

根据您是否使用无符号整数以及您运行的是哪个版本的MySQL,您运行获得主键的讨厌负值的溜冰场或者(更糟糕的是)该行不会是插入并会抛出一个错误。这就是说,你可以很容易地使用ALTER命令来改变MySQL中整数的大小/类型,以抢先阻止这种情况的发生。 INT被用作主键的“标准”大小是一个INT(11),但绝大多数DB应用程序不需要任何大的东西。尝试一个MEDIUMINT。

MEDIUMINT - 符号范围是-8388608到8388607.无符号的范围是0到16777215

相比于....

INT或INTEGER - 符号范围是-2147483648到2147483647.无符号的范围是0到4294967295

还有BIGINT,但说实话,你可能有mu比你的数据类型更大的可扩展性问题,担心如果你有一个超过20亿行的表:)

+1

行是不是插入一个错误真的“更糟”?我宁愿让系统快速失败,而不是有可能(一天)覆盖ID值。 – Calum 2009-10-17 00:14:01

+0

一个公平的观点 - 这取决于数据的重要性。如果它是真实的波动性,就像OP声称的那样,翻转可能是两个恶魔中较小的一个。无论哪种方式,这个问题都很容易避免。 – AvatarKava 2009-10-17 00:34:57

-2

那么,默认的32位INT上升到20亿左右。每天5000个ID,这是大约1000年,直到溢出。我认为你不必担心...

+0

这并不直接回答问题。 – slypete 2009-10-17 00:05:52