为啥 MySQL 从 1 计数而不是 0?

Posted

技术标签:

【中文标题】为啥 MySQL 从 1 计数而不是 0?【英文标题】:Why does MySQL count from 1 and not 0?为什么 MySQL 从 1 计数而不是 0? 【发布时间】:2013-02-09 21:36:40 【问题描述】:

数组的第一个元素(在大多数编程语言中)的 id(索引)为 0。mysql 表的第一个元素(行)的(自动递增)id 为 1。后者似乎是个例外。

【问题讨论】:

第 0 行并没有什么特别之处。然而,第一行确实如此。还有NO_AUTO_VALUE_ON_ZERO 设置。 dev.mysql.com/doc/refman/5.0/en/… AUTO_INCREMENT 值不会将类似数组的数据结构传递给表,行本身保持不相关且无序。他们所做的只是确保主键的唯一性。不要将它们视为索引数据结构! SQL 通常是基于 1 的。此外,零在很多语言中都是错误的,所以如果自动增量从零开始,那么每个人都会抱怨他们不能if(o.id) @MichaelBerkowski,任何人的。那不是重点。关键是您的评论没有回答问题。它也没有解释为什么你会投票关闭它。 @EmanuilRusev:这个问题写得不好。那里甚至没有真正的问题。重写它,然后我们可以投票重新打开它。 【参考方案1】:

您可以将自动递增列的开始设置为任意数字,如下所示:

ALTER TABLE tbl AUTO_INCREMENT = 1;
ALTER TABLE tbl AUTO_INCREMENT = 10;
ALTER TABLE tbl AUTO_INCREMENT = 100;

默认为 1。

另见:

http://dev.mysql.com/doc/refman/5.1/en/example-auto-increment.html

【讨论】:

很高兴知道,但这是为什么呢? 自动增量是一个 PK,与数组从零开始的编号无关。它在那里确保记录是唯一的。也可以定义一个增量值(n),使PK增加n。所以如果你从 1000 开始,增量是 10,你会得到 1010,1020,1030...这可能很有趣(与数组有关):en.wikipedia.org/wiki/Zero-based_numbering【参考方案2】:

我想的主要原因是数据库中的一行不是数组,并且从数组索引的意义上说,自动增量值不是索引。主键 id 可以是任何值,并且在很大程度上它只是必不可少的,它是唯一的并且不能保证是其他任何值(例如,您可以删除一行并且它不会重新编号)。

这有点像比较苹果和橘子!

数组从 0 开始,因为这是第一个数字。 Autoinc 字段也可以从您想要的任何数字开始,在这种情况下,我们都希望它是 1。

【讨论】:

【参考方案3】:

要问的更好的问题是“为什么数组是零索引的?”原因与指针算法有关。数组的索引是相对于指针地址的偏移量。在 C++ 中,给定数组char x[5],表达式x[1]*(x + 1) 是等价的,假设sizeof(char) == 1

所以从 1 开始的自动递增字段是有意义的。数组和这些字段之间没有真正的关联。

【讨论】:

以上是关于为啥 MySQL 从 1 计数而不是 0?的主要内容,如果未能解决你的问题,请参考以下文章

为啥计数排序的时间和空间复杂度是 O(n + k) 而不是 O(max(n, k))?

Javascript计数器变为0而不是给定数字[关闭]

MySQL = 按月份分组销售计数,然后将月份显示为名称(Jan、Feb...DEC)而不是数值(1、2、3-12)

php中3个小数的计算,如134.7-52.5 - 82.2,为啥结果不是0而是一个奇怪的科学计数法?

mysql通过拥有计数组

当我在 nodejs 中使用 sequelize 进行 groupby 时,我得到计数​​为 1 而不是 0