MySQL 重复 ID

标签 mysql auto-increment

MySQL 会不会两次生成相同的自动增量 ID?

我们有以下情况:

  1. id=100 的账单已创建;

  2. 然后就被删除了;

  3. 然后创建了另一个账单,它具有相同的 id = 100;

表的结构是:

CREATE TABLE `bill` (
  `id` int(11) NOT NULL auto_increment,
  `user` int(11) NOT NULL,
  `date` datetime NOT NULL,
  `state` int(11) NOT NULL,
  `adv` bit(1) NOT NULL default b'0',
  `weight` int(11) default NULL,
  PRIMARY KEY  (`id`),
  KEY `FK2E2407EC768806` (`user`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

ALTER TABLE `bill`
  ADD CONSTRAINT `FK2E2407EC768806` FOREIGN KEY (`user`) REFERENCES `user` (`id`);

是否存在竞争条件或 MySQL 是否保证唯一的自动增量 ID?

更新:我们无法重现这种情况,但我们记录了它。

最佳答案

自增在不同的存储引擎中有不同的处理方式。例如,对于 MyISAM,下一个自动增量值将被持久化,这样如果您重新启动 MySQL 服务器,它将保留该自动增量值。

但是,InnoDB 不会保留下一个自动递增的值,因此如果您重新启动 MySQL 服务器,它将计算当前的最大值并从那里递增。

这与您相关,因为您使用的是 InnoDB。因此,如果 100 是表中的最大 id 值,则删除该行,然后重新启动 MySQL 服务器,然后它将在下一次插入时重新使用 100。

这里有一个简单的例子来说明这一点:

mysql> CREATE TABLE `bill` (
    ->   `id` int(11) NOT NULL auto_increment,
    ->   PRIMARY KEY  (`id`)
    -> ) ENGINE=InnoDB  DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.12 sec)

mysql> -- start at 99 to force next value to 100
mysql> insert into bill values (99);
Query OK, 1 row affected (0.01 sec)

mysql> -- use auto-increment, should be 100
mysql> insert into bill values (null);
Query OK, 1 row affected (0.00 sec)

mysql> select * from bill;
+-----+
| id  |
+-----+
|  99 |
| 100 |
+-----+
2 rows in set (0.00 sec)

mysql> -- delete max value
mysql> delete from bill where id = 100;
Query OK, 1 row affected (0.00 sec)

mysql> -- use auto-increment, should be 101
mysql> insert into bill values (null);
Query OK, 1 row affected (0.00 sec)

mysql> select * from bill;
+-----+
| id  |
+-----+
|  99 |
| 101 |
+-----+
2 rows in set (0.00 sec)

mysql> -- delete max value
mysql> delete from bill where id = 101;
Query OK, 1 row affected (0.00 sec)

mysql> 
mysql> /*** RESTART MYSQL ***/
mysql> 
mysql> -- use auto-increment, should be 100
mysql> insert into bill values (null);
Query OK, 1 row affected (0.01 sec)

mysql> select * from bill;
+-----+
| id  |
+-----+
|  99 |
| 100 |
+-----+
2 rows in set (0.00 sec)

关于MySQL 重复 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5322089/

相关文章:

sql - 通过phpMyAdmin在MySQL中创建id字段时是否必须指定整数长度?

android - 仅在 INTEGER PRIMARY KEY 上允许使用 AUTOINCREMENT - android

mysql - 什么是 MySQL 中状态的最佳列类型

java - 安卓/PHP : Login successful but Failed redirect to the next activity

php - 当记录多于一个 PHP 时插入到所有单元格

java - 找出哪一行已被更新/删除 JDBC (ResultSet)

c# - Monotouch 自动增量内部版本号及版本号

java - 列ID的增量

mysql - 如何处理生成自动增量主 ID 的表中的多次插入?

mysql - 将 autoincrement id 字段加一