MySQL AUTO INCREMENT 字段值是不是总是大于 0?

Posted

技术标签:

【中文标题】MySQL AUTO INCREMENT 字段值是不是总是大于 0?【英文标题】:Is MySQL AUTO_INCREMENT field value alway greater than 0?MySQL AUTO INCREMENT 字段值是否总是大于 0? 【发布时间】:2021-12-29 11:58:19 【问题描述】:

从带有 AUTO_INCREMENT 列的 mysql 表中获取 ID 时,我总是检查它是否严格大于 0。 但最近我在想,AUTO_INCREMENT 是不是有严格的规定?

【问题讨论】:

0 和负 id 有什么问题? 您不能创建带有负 AUTO_INCREMENT 的表或在 ALTER TABLE 中设置负值 - 这会导致语法错误。如果在 CREATE TABLE 中将其设置为 0,则忽略此设置,等于设置为 1。如果您在 ALTER TABLE 中将其设置为小于当前值,则忽略此更改。但是您可以显式插入负值(这不会更改当前的 AUTO_INCREMENT 值)。见dbfiddle.uk/… ' 我总是检查它是否严格大于 0。' - 根据上下文可能是个好主意.. 【参考方案1】:

默认行为

这对于 MySQL 和 MariaDB 数据库是 TRUE,除非您进行了一些设置操作。 MySQL 文档中没有明确的声明: https://dev.mysql.com/doc/refman/8.0/en/example-auto-increment.html 但从描述和这句话可以理解:

要从 1 以外的 AUTO_INCREMENT 值开始,请设置该值 使用 CREATE TABLE 或 ALTER TABLE,像这样

所以默认的起始值始终是 1,而不是 0。 并且您不能将 AUTO_INCREMENT 列值设置为 0,除非您设置 NO_AUTO_VALUE_ON_ZERO: https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html#sqlmode_no_auto_value_on_zero 顺便说一句,它说:

mysqldump 自动在其输出中包含一条语句 启用 NO_AUTO_VALUE_ON_ZERO 所以要小心。

MariaDB 文档中有一个明确的声明: https://mariadb.com/kb/en/auto_increment/

AUTO_INCREMENT 列默认从 1 开始。自动 生成的值永远不能低于 0。

溢出

如果值溢出,它也不会设置为 0: https://dev.mysql.com/doc/refman/8.0/en/example-auto-increment.html

当列达到数据类型的上限时,下一个 尝试生成序列号失败。

【讨论】:

以上是关于MySQL AUTO INCREMENT 字段值是不是总是大于 0?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL AUTO INCREMENT 字段值是不是总是大于 0?

mysql 约束条件 auto_increment 自动增长目录

MySQL基础之 AUTO_INCREMENT

MySQL 自增字段取值

MySQL 序列使用:使用 AUTO_INCREMENT获取AUTO_INCREMENT值

SQL AUTO INCREMENT 字段