主键应该始终是未签名的?

nev*_*ame 42 mysql database

因为主键(标识符)不会低于0,我想它应该总是未签名?

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/2max/2-1.无论哪种方式,您都可以获得相同的绝对值绝对值.

但是,由于AUTO_INCREMENT默认情况下从零开始并且在正方向上递增,因此使用正值比使用负值更方便.

但是,获得2倍的正值并不重要.任何超过最大有符号整数值2 31 -1的表都可能继续增长,因此您应该只BIGINT为这些表使用a .

即使您删除所有行并每天重新加载多次,您确实非常非常不可能分配超过2 63 -1个主键值.

  • 为了最大限度地提高清晰度:从MySQL 4.1+开始,SERIAL特别是"BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE"的别名. (3认同)
  • 我会小心:如果您升级到无符号,您可能需要在编程语言中切换到更大的数字类型。例如,用 Long 代替 Integer,或者用 BigInteger 代替 Long。这可能会对软件部分(内存消耗、性能、调整工作)产生相当大的影响,恕我直言,不值得将值加倍。 (2认同)

Joh*_*nFx 6

为什么你认为主键不会低于0?那不是一个给定的.我认为你将它与标识栏混淆了.

在任何情况下,无论采用哪种方式,它都应该没有明显的区别,将数据类型映射到列中预期的数据类型,无论它是否是主键.