【问题标题】:MySQL auto_increment initial valueMySQL auto_increment 初始值
【发布时间】:2021-05-07 22:33:02
【问题描述】:

我在 MySQL V5.7.28 中创建了一个表,其中 PK 初始值为 50,并以 10 的步长增加。例如50、60、70 等。我的代码是:

  Set Session auto_increment_increment=10;

  Create Table Dept (
  DeptNo Integer NOT NULL auto_increment,  
  DName Varchar(45), 
  Primary Key (DeptNo)
  ) AUTO_INCREMENT=50;

我在表格中插入了 3 行,然后得到

  51, Accounting
  61, Sales
  71, Tax

增量大小是正确的(10),但初始值比我预期的高 1。

如果我打开另一个会话,请在没有“Set Session auto_increment_increment=10;”的情况下重新运行上述代码,我会得到预期的结果

  50, Accounting
  51, Sales
  52, Tax

这是正确的初始值 50,但步长是 1 而不是我计划使用的 10 I。

设置 auto_increment_increment 似乎会使 auto_increment 字段的初始值增加 1。

对我做错了什么有什么想法吗? 非常感谢,

【问题讨论】:

  • 自动递增列默认从 1 开始。这有一个很大的优势,即您永远不会有 Id=0 的行,因此通过请求 Id=null 的行或您可以插入Id=null 并且数据库将自动使用下一个自动增量值。

标签: mysql auto-increment


【解决方案1】:

如果您希望值是 10 的倍数,您可以set auto_increment_offset=10;

演示:

mysql> create table mytable (id int auto_increment primary key);
Query OK, 0 rows affected (0.05 sec)

mysql> set auto_increment_increment=10;
Query OK, 0 rows affected (0.00 sec)

mysql> set auto_increment_offset=10;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into mytable () values ();
Query OK, 1 row affected (0.04 sec)

mysql> insert into mytable () values ();
Query OK, 1 row affected (0.04 sec)

mysql> insert into mytable () values ();
Query OK, 1 row affected (0.04 sec)

mysql> select * from mytable;
+----+
| id |
+----+
| 10 |
| 20 |
| 30 |
+----+

您不能将偏移量设置为 0,因为最小值为 1。

mysql> set auto_increment_offset=0;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> show warnings;
+---------+------+------------------------------------------------------+
| Level   | Code | Message                                              |
+---------+------+------------------------------------------------------+
| Warning | 1292 | Truncated incorrect auto_increment_offset value: '0' |
+---------+------+------------------------------------------------------+

【讨论】:

    【解决方案2】:

    期望AUTO_INCREMENT 提供“独特性”以外的任何东西是不明智的。

    在很多情况下会跳过一个数字而没有真正让您知道。

    如果不同的连接插入到该表中,它们需要适当的协调。

    等等

    不要使用 A_I,而是考虑类似的东西

    INSERT INTO Dept (...)
        SELECT MAX(DeptNo) + 10, "PartyPlanning"
            FROM Dept;
    

    【讨论】:

      猜你喜欢
      • 2018-08-02
      • 2022-07-21
      • 2011-12-22
      • 2020-03-21
      • 2014-10-08
      • 2021-03-14
      • 2016-07-26
      • 1970-01-01
      • 2021-12-04
      相关资源
      最近更新 更多