【问题标题】: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。' - 根据上下文可能是个好主意..

标签: mysql sql


【解决方案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

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

【讨论】:

    猜你喜欢
    • 2022-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-28
    • 2019-12-30
    • 2013-05-27
    • 2019-09-29
    相关资源
    最近更新 更多