2

我为我们的预订系统编写了一个发票模块。

所以当我创建一个新的发票时,我会通过 MySQL 自动生成一个主键。

然而,目前这只是一个简单的整数计数。

问题是我们有义务以“#year#id”的形式提供发票编号,其中#year 是例如 2013,而#id 是每年从 1 开始的 id。

因此,例如 20131、20132、20133 和 2014 年将是 20141、20142。

如何使用自定义主键生成器解决此问题?

4

3 回答 3

2

您可以在您的年份和 ID 中创建两个字段。

在两个字段上创建一个主键,为 id 提供 auto_increment 选项。对于 year 的每个唯一值,id 将向上计数。例如:

2012    1
2012    2
2012    3
2013    1

您可以在选择时连接它们:SELECT CONCAT(year,id) AS primary FROM table

插入将是:

INSERT INTO 表 SET 年份 = YEAR(NOW())

您不必指定 id。

于 2013-03-01T07:35:51.477 回答
2

您应该使用过程或触发器。构建 newInvoiceId 的特定查询应该是这样的:

SELECT CONCAT(YEAR(now()),count(*)+1) as newInvoiceId
FROM table
WHERE InvoiceId like CONCAT(YEAR(now()),'%');

我不是 100% 有信心的唯一部分是CONCAT(YEAR(now()),'%')

于 2013-03-01T07:38:54.673 回答
0

警告不要像 2012/01 这样幼稚的年/周。YEAR(NOW()) 是错误的。

更好用YEARWEEK(NOW())。给出一个像 201201 这样的数字

下面显示 year 不一定是 year-of-week-number:

mysql> SELECT YEARWEEK('1987-01-01');
       -> 198652

对于在一个 int 中包含年和周的其余部分,实际上更简单。

int year = yearweek / 100;
int week = yearweek % 100;
于 2018-01-15T11:51:06.103 回答