由于主键(标识符)不会低于0,我想它应该始终是无符号的?

推荐答案

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的值为232BIGINT的值为264.如果数字是无符号的,则得到从0到最大值减1的值.如果数字是有符号的,则得到-max/2max/2-1之间的值.无论哪种方式,都会得到相同绝对数的不同值.

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

但你能得到2倍于2倍的正值,这并不重要.任何超过最大有符号整数值231-1的表都有可能继续增长,因此这些表应该使用BIGINT.

即使删除所有行并一天多次重新加载,也不太可能分配超过2个主键值.

Mysql相关问答推荐

MySQL在带有特定属性值上的对象的数组的杨森对象中搜索

是否有一种方法可以 Select 表中具有特定列值的行,该行还显示phpmyadmin中原始表中的行号?

SQL-从一个字段中 Select 值,但另一个字段中不包含零值

如何使用GROUP BY调优简单SQL查询

为什么我的 SQL 查询不更新 Node.js 和 MySQL 中用户以外的用户属性?

看不懂mysql自左连接查询

如何使用mysql更新列中的json数据

MySQL如何在小时和分钟之间 Select 时间

MYSQL REGEXP_REPLACE 在数字之后

MySQL查询以获取日期范围内的租赁订单

在 postgresql 中实现 UML 类:创建类型与创建表

在 MySQL 中为多列创建索引以进行查询优化

结果差异(MySQL 5.7 vs MySQL 8.0)

使用 MySQL 流式传输大型结果集

从一个带有连接的表中删除

通过数据库级​​别本身的查询反序列化

从 MYSQL 查询中计算列的平均值

如何存储重复日期牢记夏令时

MySQL讲解查询理解

将数据库从 Postgres 迁移到 MySQL