Java 如何为每个用户设置第二个自动增量列?

Java 如何为每个用户设置第二个自动增量列?,java,mysql,triggers,auto-increment,invoice,Java,Mysql,Triggers,Auto Increment,Invoice,我知道以前有人问过这个问题,大多数答案都警告我不要这样做,或者为MyISAM提供解决方案,但我使用的是InnoDB。 我正在尝试为用户生成一张发票或账单,以便他向我提供业务计划要求 问题是,在我国,应该为同一个人指定账单ID的参考号,否则他将被审计丢失的账单。比如说,他给了我一张有0001的账单,第二张是0005。他将因失踪4人而接受审讯 所以我需要有一个自定义的每个用户ID的自动增量 用户1-idUser=1,idBill=1 用户1-idUser=1,idBill=2 用户2-idUsr=2

我知道以前有人问过这个问题,大多数答案都警告我不要这样做,或者为MyISAM提供解决方案,但我使用的是InnoDB。 我正在尝试为用户生成一张发票或账单,以便他向我提供业务计划要求

问题是,在我国,应该为同一个人指定账单ID的参考号,否则他将被审计丢失的账单。比如说,他给了我一张有0001的账单,第二张是0005。他将因失踪4人而接受审讯

所以我需要有一个自定义的每个用户ID的自动增量

用户1-idUser=1,idBill=1

用户1-idUser=1,idBill=2

用户2-idUsr=2,idBill=1

一些线程建议使用触发器,而另一些线程则警告使用表锁。我个人不熟悉触发器,所以我避开它们,因为它们需要维护

我正在使用Java和MySQL。

一个例子:


dbfiddle

一些线程建议使用触发器,而其他线程则警告使用表锁。为避免表锁定,请使用额外的MyISAM基表进行自动增量生成。我不是DB专家,但如果您的系统不删除或复制发票,您可以将id生成为现有发票的数量+1,例如。。。。id=从发票中选择计数*,其中用户=…+。。。。您也可以尝试将发票计数存储在列中,例如用户表或设计更好的列中,从那里读取并在单独的查询中递增。@Thomas这可能会在并发线程中产生重复值。@Akina您是对的,这将不得不处理。无论如何,不要这样做。如果必要的话,只需“在飞行中”计算序列。它工作得非常好!非常感谢你,我的救世主!这个解决方案有什么缺点吗?@ZiedOrabi,除了存在不允许删除数据的附加表之外?也许,有些缺点存在,但我不知道。再次感谢。如果遇到问题,我会发布一些东西
CREATE TABLE main (id INT AUTO_INCREMENT PRIMARY KEY,
                   primary_id CHAR(3), 
                   secondary_id INT) ENGINE = InnoDB;
CREATE TABLE auxiliary (primary_id CHAR(3), 
                        secondary_id INT AUTO_INCREMENT,
                        PRIMARY KEY (primary_id, secondary_id)) ENGINE = MyISAM;
CREATE TRIGGER generate_secondary_id
BEFORE INSERT 
ON main
FOR EACH ROW
BEGIN
    INSERT INTO auxiliary (primary_id) VALUES (NEW.primary_id);
    SET NEW.secondary_id = LAST_INSERT_ID();
END
INSERT INTO main (primary_id) VALUES
('A01'),
('A01'),
('B01'),
('C01'),
('A01'),
('B01'),
('A01'),
('B01');
SELECT * FROM main;
id | primary_id | secondary_id -: | :--------- | -----------: 1 | A01 | 1 2 | A01 | 2 3 | B01 | 1 4 | C01 | 1 5 | A01 | 3 6 | B01 | 2 7 | A01 | 4 8 | B01 | 3