我有一个mySQL(InnoDB)表:
belegID int NOT_NULL PRIMARY_KEY AUTO_INCREMENT,
docNum int NOT_NULL,
docYear date NOT_NULL,
.... -- more columns
我需要以下关系:
我如何在mySQL方面解决这个问题,如何获得下一个docNum(与年份相关的ID)?
提前谢谢。
答案 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
- 因此将使用索引。