我有一个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)?先感谢您。 最佳答案 您可以使用triggers解决问题。这是一个简单的示例(如果尝试使用它,请不要忘记重命名架构和表):DELIMITER //CREATE TRIGGER fillDocNumber BEFORE INSERT ON test.tFOR EACH ROWBEGIN 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>插入t(docYear)个值('2013-04-06');查询正常,1行受影响(0.13秒)mysql>插入t(docYear)个值('2012-02-18');查询正常,受影响的1行(0.05秒)mysql>插入t(docYear)个值('2013-12-11');查询正常,受影响的1行(0.02秒)mysql>插入t(docYear)个值('2014-10-30');查询正常,1行受影响(0.07秒)mysql>插入t(docYear)个值('2014-01-03');查询正常,1行受影响(0.06秒)现在是我们的结果:mysql>选择* 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行(0.00秒)很符合预期。提示:重命名字段docYear,这很令人困惑。正确的名称应为docDate(或将年份和文档的日期存储在单独的字段中-实际上,这将提高性能,因为这样您就可以通过它创建索引并摆脱计算在触发器内-因此将使用索引)。 10-08 18:48