【问题标题】:MySQL custom primary key generatorMySQL 自定义主键生成器
【发布时间】:2013-02-15 15:47:50
【问题描述】:

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

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

但目前这只是一个简单的整数计数。

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

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

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

【问题讨论】:

  • 你想用java或者原生sql来做
  • 本机 SQL(如果可能)。

标签: java mysql primary-key generator


【解决方案1】:

您可以在您的年份和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 = YEAR(NOW())

您不必指定 id。

【讨论】:

【解决方案2】:

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

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

我不能 100% 确定的唯一部分是 CONCAT(YEAR(now()),'%')

【讨论】:

    【解决方案3】:

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

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

    以下显示年份不一定是 year-of-week-number:

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

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

    int year = yearweek / 100;
    int week = yearweek % 100;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多