2013-02-24 91 views
2

数组的第一个元素(在大多数编程语言中)的id(索引)为0. MySQL表的第一个元素(行)具有(自动递增的)id。后者似乎是个例外。为什么MySQL从1开始计数而不是0?

+1

0行不太响。但是,第一行的确如此。还有'NO_AUTO_VALUE_ON_ZERO'设置。 http://dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html#sqlmode_no_auto_value_on_zero – hank 2013-02-24 18:43:18

+0

也许大多数编程语言,但不是全部(http://en.wikipedia.org/wiki/Comparison_of_programming_languages_ %28array%29#Array%5Fsystem%5Fcross-reference%5Flist) – thebjorn 2013-02-24 18:44:17

+2

AUTO_INCREMENT值不会将类似数组的数据结构赋予表,行本身保持不相关和无序。他们所做的只是确保主键的唯一性。不要把它们看作索引数据结构! – 2013-02-24 18:44:19

回答

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

+0

很高兴知道,但为什么呢? – 2013-02-24 18:48:44

+1

自动增量是一个PK,与数组的基于零的编号没有关系。在那里确保记录是独一无二的。你也可以定义一个增量值(n),并使PK增加n。所以如果你从1000开始,增量为10,你得到1010,1020,1030 ......这可能很有趣(与数组有关):http://en.wikipedia.org/wiki/Zero-based_numbering – Roger 2013-02-24 19:19:56

0

的我猜想的主要原因是数据库中的行不是数组,而且自动增量值不是数组索引所指的索引。主键ID可以是任何值,并且在很大程度上它是非常重要的,它是唯一的,不能保证是其他任何东西(例如,你可以删除一行并且不会重新编号)。

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

数组从0开始,因为这是第一个数字。 Autoinc字段从你想要的任何数字开始,在这种情况下,我们宁愿它是1.

2

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

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

相关问题