mysql中的第二个自动增量

时间:2014-03-07 12:33:17

标签: mysql sql innodb

我有一个mySQL(InnoDB)表:

belegID int NOT_NULL PRIMARY_KEY AUTO_INCREMENT,
docNum int NOT_NULL,
docYear date NOT_NULL,
.... -- more columns

我需要以下关系:

  • belegID是主键(唯一ID)。
  • docNum也是(唯一)ID,但与年份相关。每年从1开始。

我如何在mySQL方面解决这个问题,如何获得下一个docNum(与年份相关的ID)?

提前谢谢。

1 个答案:

答案 0 :(得分:0)

您可以使用triggers来解决您的问题。这是一个简单的例子(如果您尝试使用它,请不要忘记重命名模式和表):

DELIMITER //
CREATE TRIGGER fillDocNumber BEFORE INSERT ON test.t
FOR EACH ROW 
BEGIN
  SET @maxNum  = (SELECT MAX(docNum) FROM test.t WHERE YEAR(docYear)=YEAR(NEW.docYear));
  IF @maxNum IS NULL THEN
     SET NEW.docNum=1;
  ELSE
     SET NEW.docNum=@maxNum+1;
  END IF;
END;//
DELIMITER ;

我们假设我们有桌子:

CREATE TABLE `t` (
  `belegID` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `docNum` int(11) unsigned DEFAULT NULL,
  `docYear` date NOT NULL,
  PRIMARY KEY (`belegID`)
) ENGINE=InnoDB;

创建触发器后,我们将使用一些数据填充它:

mysql> insert into t (docYear) values ('2013-04-06');
Query OK, 1 row affected (0.13 sec)

mysql> insert into t (docYear) values ('2012-02-18');
Query OK, 1 row affected (0.05 sec)

mysql> insert into t (docYear) values ('2013-12-11');
Query OK, 1 row affected (0.02 sec)

mysql> insert into t (docYear) values ('2014-10-30');
Query OK, 1 row affected (0.07 sec)

mysql> insert into t (docYear) values ('2014-01-03');
Query OK, 1 row affected (0.06 sec)

现在是我们的结果:

mysql> select * from t;
+---------+--------+------------+
| belegID | docNum | docYear    |
+---------+--------+------------+
|       1 |      1 | 2013-04-06 |
|       2 |      1 | 2012-02-18 |
|       3 |      2 | 2013-12-11 |
|       4 |      1 | 2014-10-30 |
|       5 |      2 | 2014-01-03 |
+---------+--------+------------+
5 rows in set (0.00 sec)

如预期的那样。

提示:重命名字段docYear,令人困惑。正确的名称将是docDate(或其中的存储年份和文档的日期在单独的字段中 - 事实上,这将提高性能,从那时起您将能够通过它创建索引并摆脱YEAR()函数计算触发器中的MAX - 因此将使用索引。