我想知道,为什么sql主键索引从1开始,为什么不从0开始?有什么原因吗?我不知道这是不是一个好地方问这样的问题,但在网上找不到答案。
ufj5ltwl1#
sql标准4.15.11标识列-https://www.sis.se/api/document/preview/916885/ 表示“一个标识列有一个起始值、一个结束值、一个增量和一个循环选项”,并不是说它应该从任何特定的数字开始,而是因为它的目的是提供一个唯一的行号(如果设置为主键),然后是一个负的开始价值将毫无意义。如果你愿意,mysql将允许你将start值设置为0,但我看不出有什么意义。在我看来,在其他语言中允许数组下标从0开始总是愚蠢的,mysql有一个从0开始的limit offset子句是一个令人讨厌的不一致性。
2ic8powd2#
sql中的计数通常以“1”开始。例如,子字符串操作从1(而不是0)开始计算字符串中的字符数。 row_number() 枚举组中的行,从1(而不是0)开始。原因很简单。人类从1开始数数——问问很多四岁的孩子就知道了。在学习编程之前,我们不会从零开始计数。作为一个物种,我们从“1”开始数了几千年,然后把0加到数字的万神殿。当从表中计算行数时,从1开始计算要直观得多:“1”对于第一行几乎不需要解释,特别是对于不是程序员的人第一行的“0”需要解释。很容易忘记,但是sql是为非程序员设计的。很多冗长的内容是因为它是为业务用户设计的。
row_number()
zqry0prt3#
用这个 SET [GLOBAL|SESSION] sql_mode='NO_AUTO_VALUE_ON_ZERO' 然后它将从0开始mysql文档
SET [GLOBAL|SESSION] sql_mode='NO_AUTO_VALUE_ON_ZERO'
3条答案
按热度按时间ufj5ltwl1#
sql标准4.15.11标识列-https://www.sis.se/api/document/preview/916885/ 表示“一个标识列有一个起始值、一个结束值、一个增量和一个循环选项”,并不是说它应该从任何特定的数字开始,而是因为它的目的是提供一个唯一的行号(如果设置为主键),然后是一个负的开始价值将毫无意义。如果你愿意,mysql将允许你将start值设置为0,但我看不出有什么意义。在我看来,在其他语言中允许数组下标从0开始总是愚蠢的,mysql有一个从0开始的limit offset子句是一个令人讨厌的不一致性。
2ic8powd2#
sql中的计数通常以“1”开始。例如,子字符串操作从1(而不是0)开始计算字符串中的字符数。
row_number()
枚举组中的行,从1(而不是0)开始。原因很简单。人类从1开始数数——问问很多四岁的孩子就知道了。在学习编程之前,我们不会从零开始计数。作为一个物种,我们从“1”开始数了几千年,然后把0加到数字的万神殿。
当从表中计算行数时,从1开始计算要直观得多:“1”对于第一行几乎不需要解释,特别是对于不是程序员的人第一行的“0”需要解释。
很容易忘记,但是sql是为非程序员设计的。很多冗长的内容是因为它是为业务用户设计的。
zqry0prt3#
用这个
SET [GLOBAL|SESSION] sql_mode='NO_AUTO_VALUE_ON_ZERO'
然后它将从0开始mysql文档