首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL自定义主键生成器

MySQL自定义主键生成器
EN

Stack Overflow用户
提问于 2013-03-01 15:29:59
回答 3查看 2.7K关注 0票数 2

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

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

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

问题是我们必须有一个"#year#id“形式的发票号码,其中#year是2013年,#id是每年从1开始的id。

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-01 15:35:51

您可以在中创建两个字段,年份和id。

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

代码语言:javascript
复制
2012    1
2012    2
2012    3
2013    1

您可以在选择时将它们连接在一起: SELECT CONCAT(year,id)作为表中的主表

插入内容为:

插入表格集合year = YEAR(NOW())

您不必指定id。

票数 2
EN

Stack Overflow用户

发布于 2013-03-01 15:38:55

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

代码语言:javascript
复制
SELECT CONCAT(YEAR(now()),count(*)+1) as newInvoiceId
FROM table
WHERE InvoiceId like CONCAT(YEAR(now()),'%');

我唯一不能百分之百自信的是CONCAT(YEAR(now()),'%')

票数 2
EN

Stack Overflow用户

发布于 2018-01-15 19:51:06

对像2012/01这样的天真年份/周发出警告。YEAR(NOW())错误。

最好使用YEARWEEK(NOW())。给出一个类似于201201的数字

下图显示年份不一定是周的年份数:

代码语言:javascript
复制
mysql> SELECT YEARWEEK('1987-01-01');
       -> 198652

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

代码语言:javascript
复制
int year = yearweek / 100;
int week = yearweek % 100;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15152718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档