Bil*_*win 52
TL/DR:是的,但几乎没关系.
自动增量总是增加,因此它永远不会使用负值.您也可以将其设为无符号,并获得两倍的值.
另一方面,如果您的表使用2 31个值,它可能也会在短时间内使用2 32个值,因此具有两倍的值范围并没有太大的区别.无论如何你必须升级到BIGINT.
MySQL支持可选的SERIAL数据类型(可能是为了与PostgreSQL兼容,因为SERIAL它不是标准的ANSI SQL).这种数据类型只是创建一个的简写BIGINT UNSIGNED.
继续试试吧:
CREATE TABLE test.foo (foo_id SERIAL PRIMARY KEY);
SHOW CREATE TABLE test.foo;
CREATE TABLE `test`.`foo` (
`foo_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`foo_id`),
UNIQUE KEY `foo_id` (`foo_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
Run Code Online (Sandbox Code Playgroud)
无论是声明有符号还是无符号整数,都会获得相同数量的不同值:a为32 32,a 为INT2 64BIGINT.如果数字是无符号的,则获得从0到最大值减去1的值.如果数字签名的,你得到的值-max/2来max/2-1.无论哪种方式,您都可以获得相同的绝对值绝对值.
但是,由于AUTO_INCREMENT默认情况下从零开始并且在正方向上递增,因此使用正值比使用负值更方便.
但是,获得2倍的正值并不重要.任何超过最大有符号整数值2 31 -1的表都可能继续增长,因此您应该只BIGINT为这些表使用a .
即使您删除所有行并每天重新加载多次,您确实非常非常不可能分配超过2 63 -1个主键值.
为什么你认为主键不会低于0?那不是一个给定的.我认为你将它与标识栏混淆了.
在任何情况下,无论采用哪种方式,它都应该没有明显的区别,将数据类型映射到列中预期的数据类型,无论它是否是主键.