Mysql Auto_increment id number Order Missing

问题描述

CREATE TABLE TableA(
  id  int  auto_increment unique,user_id INTEGER,content_id VARCHAR(10),points  INTEGER,content_type INTEGER,description VARCHAR(100),created_date DATETIME,PRIMARY KEY(user_id,content_id,content_type)
)

我创建了 TableA,但问题是当我将记录插入到 TableA 然后面临 id Auto_increment 问题时,

在下表中首先,我添加一个唯一的对然后 id=1

在第二次尝试添加相同的记录后,它抛出了 user_id、content_id 和 content_type 组合的错误 BCS 是唯一的,我认为它工作正常

第三次,我以不同的方式添加了它然后将它添加到桌子上但是Id = 3,我的问题是为什么缺少Id以及如何解决它,任何人都可以帮助我,请

:id user_id,points,content_type,description,created_date: 
1    1        1a1           5        1              null     2021-02-26 08:26:54
3    1        1a1           5        2              null     2021-02-26 08:26:56
5    1        1a2           5        1              null     2021-02-26 08:26:54
6    1        1a3           5        2              null     2021-02-26 08:26:56

我想将记录插入到一​​个没有缺少 ID 号顺序的表中,如下所示

:id user_id,created_date: 
1    1        1a1           5        1              null     2021-02-26 08:26:54
2    1        1a1           5        2              null     2021-02-26 08:26:56
3    1        1a2           5        1              null     2021-02-26 08:26:54
4    1        1a3           5        2              null     2021-02-26 08:26:56

解决方法

-- add a column for enumeration
ALTER TABLE TableA
ADD COLUMN enumeration INT UNSIGNED UNIQUE;
-- create trigger which assigns enumeration values
CREATE TRIGGER tr_bi_TableA
BEFORE INSERT
ON TableA
FOR EACH ROW
SET NEW.enumeration = COALESCE(1 + (SELECT MAX(enumeration) FROM TableA),1);

https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=0119b35e59188a0ecec70fdec7fe4d41

如果 2 个并发进程应该尝试同时插入相同的值,那么其中一个将由于违反唯一约束而失败。所以避免平行插入。