TL/DR:Yes, but it almost doesn't matter.
自动增量总是增加,所以它永远不会使用负值.你也可以把它设为无符号,得到两倍的值.
另一方面,如果您的表使用了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
无论声明的是有符号还是无符号整数,都会得到相同数量的不同值:INT
的值为232,BIGINT
的值为264.如果数字是无符号的,则得到从0到最大值减1的值.如果数字是有符号的,则得到-max/2
到max/2-1
之间的值.无论哪种方式,都会得到相同绝对数的不同值.
但由于默认情况下AUTO_INCREMENT
从零开始,并沿正方向递增,因此利用正值比利用负值更方便.
但你能得到2倍于2倍的正值,这并不重要.任何超过最大有符号整数值231-1的表都有可能继续增长,因此这些表应该使用BIGINT
.
即使删除所有行并一天多次重新加载,也不太可能分配超过2个主键值.