如何生成唯一的分组自动增量文档ID?

问题描述 投票:0回答:1

我需要制作一些表格,这些表格能够根据每种文档网络类型的日期自动递增一年中每个月的唯一文档名称。我认为将其作为 MySql 表中生成的存储列是一个好主意。泰国使用佛教历法,通常在基督教历法上添加 543 年(2024 年变为 2567 年),在这种情况下,我添加 43 年,因为我只需要年份的最后一位数字。然后我丢失了最后一个序列号,在互联网上进行大量搜索后我找不到解决方案。我认为应该在分组下找到它。 在这种情况下,我正在处理发票。

我的桌子:

CREATE TABLE `tbl_0_invoices` (
  `invoice_date` date NOT NULL,
  `invoice_no` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci GENERATED ALWAYS AS (concat(_utf8mb4'INV',(date_format(`invoice_date`,_utf8mb4'%y') + 43),date_format(`invoice_date`,_utf8mb4'%m'))) STORED;
  
 ALTER TABLE `tbl_0_invoices`
  ADD PRIMARY KEY (`invoice_no`);

我还没有找到任何关于这个问题的文档,即使这种文档识别在泰国也很正常。

我期待这个输出。

发票日期 发票_编号
2567/8/21 INV6708-1
2567/9/13 INV6709-1
2567/9/13 INV6709-2
2567/9/13 INV6709-3
2567/9/13 INV6709-4
2567/9/18 INV6709-5
2567/10/25 INV6710-1
2567/10/25 INV6710-2
2567/10/25 INV6710-3
2567/10/25 INV6710-4
2568/1/24 INV6801-1
mysql grouping auto-increment stored-functions
1个回答
0
投票

使用

DATE_FORMAT(date, "%y%m")
获取数字年份和月份,格式为:
YYMM

使用

row_number() OVER (PARTITION BY date)
获取增量值 w.r.t
YYMM
值。

所以,你的 MySQL 查询应该是:

select 
    cast(invoice_date as date) as invoice_date,
    CONCAT("INV", 
        DATE_FORMAT(cast(invoice_date as date), "%y%m"),
        "-",
        row_number() OVER (PARTITION BY DATE_FORMAT(cast(invoice_date as date), "%y%m"))
    ) as invoice_no
from mySQLTable;

检查结果:db<>fiddle

结果如下:

enter image description here

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.