【问题标题】:How to set an a second Auto increment column per user?如何为每个用户设置第二个自动增量列?
【发布时间】:2021-07-13 08:17:36
【问题描述】:

我知道以前有人问过这个问题,并且大多数答案都警告过这样做或建议 MyISAM 的解决方案,但我正在使用 InnoDB。 我正在尝试为用户生成发票或账单,让他给我(商业计划要求)!

问题是在我的国家应该为同一个人订购账单ID的参考,否则他将被审计丢失的账单。比如他给了我一张0001的账单,第二张是0005。他会因缺少4而被审问。

所以我需要为每个 UserID 设置一个自定义的自动增量。

用户 1 - idUser= 1 ,idBill = 1

用户 1 - idUser= 1 ,idBill = 2

用户 2 - idUsr = 2 , idBill = 1

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

我正在使用 Java 和 MySQL。

【问题讨论】:

  • 一些线程建议使用触发器,而另一些线​​程则警告表锁。为了避免表锁,请使用额外的 MyISAM 基表来生成自动增量。
  • 我不是数据库专家,但如果您的系统没有删除或复制发票,您可以将 id 生成为现有发票的数量 + 1,例如.... id = (select count(*) from invoice where user =...) + ! ...。您也可以尝试将发票计数存储在一个列中(例如用户表或设计更好的东西),从那里读取它并在单独的查询中增加。
  • @Thomas 这可能会在并发线程中产生重复值。
  • @Akina 你是对的,那必须处理。
  • 无论如何,不​​要这样做。如有必要,只需“即时”计算序列即可。

标签: java mysql triggers auto-increment invoice


【解决方案1】:

一个例子:

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 |次要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

db小提琴here

【讨论】:

  • 效果很好!非常感谢你,我的救命恩人!我应该注意这个解决方案有什么缺点吗?
  • @ZiedOrabi 除了存在附加表之外,哪些数据不允许删除?也许,存在一些缺点,但我不知道。
  • 再次感谢。如果我遇到问题,我会发布一些东西
猜你喜欢
  • 2015-12-14
  • 2014-09-27
  • 2014-05-19
  • 2019-02-23
  • 2021-06-13
  • 2018-07-19
  • 2011-08-23
  • 2023-03-16
  • 2020-12-25
相关资源
最近更新 更多