问题描述
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 问题时,
在第二次尝试添加相同的记录后,它抛出了 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 个并发进程应该尝试同时插入相同的值,那么其中一个将由于违反唯一约束而失败。所以避免平行插入。