0

我最近在我的应用程序中遇到了并发事务的错误。以前,复合键的自动递增是使用应用程序本身使用 PHP 实现的。然而,正如我所提到的,id 被重复了,并且发生了各种各样的问题,我后来煞费苦心地手动修复了这些问题。

现在我已经阅读了相关问题并找到了使用触发器的建议。

所以我打算实现一个有点像这样的触发器。

DELIMITER $$
CREATE TRIGGER auto_increment_my_table
    BEFORE INSERT ON my_table FOR EACH ROW
        BEGIN
            SET NEW.id = SELECT MAX(id) + 1 FROM my_table WHERE type = NEW.type;
        END $$
DELIMITER ;

但是我对并发性的怀疑仍然存在。就像这个触发器是同时执行的并且在查询时都得到了相同的 MAX(id) 怎么办?

这是处理我的问题的正确方法还是有更好的方法?

4

1 回答 1

0

一个例子 - 如何解决复合索引中的自动增量。

CREATE TABLE test ( id INT,
                    type VARCHAR(192),
                    value INT,
                    PRIMARY KEY (id, type) );
-- create additional service table which will help

CREATE TABLE test_sevice ( type VARCHAR(192),
                           id INT AUTO_INCREMENT,
                           PRIMARY KEY (type, id) ) ENGINE = MyISAM;
-- create trigger which wil generate id value for new row

CREATE TRIGGER tr_bi_test_autoincrement
BEFORE INSERT
ON test
FOR EACH ROW
BEGIN
    INSERT INTO test_sevice (type) VALUES (NEW.type);
    SET NEW.id = LAST_INSERT_ID();
END

db<>在这里摆弄


创建一个服务表只是为了自动增加一个值对我来说似乎不太理想。– 穆罕默德·穆菲德

该表非常小——您可以随时删除除该组中自动增量值最大的每组记录之外的所有记录。——秋名

https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=61f0dc36db25dd5f0cf4647d8970cdee

您可以安排在服务事件过程中移除多余的行(例如,每天)。

于 2021-05-20T13:33:11.617 回答