如果您使用 MyISAM 引擎来存储此表,这可以相对简单地完成:您只需这样定义字段:
cid INT NOT NULL,
course_based_id INT NOT NULL AUTO_INCREMENT,
...
PRIMARY KEY (cid, course_based_id)
然后任何INSERT 将根据cid 自动为course_based_id 分配一个新的(+1) 值。这是一个 Fiddle 说明这个概念。
你可以在MySQL documentation找到更多信息。
不幸的是,InnoDB 引擎中没有这样的机制。所以也许你可以摆脱以下例程(这是一个伪代码,有一些细微差别):
1) lock table for writing;
2) @x = SELECT MAX(course_based_id) WHERE cid = %cid_to_be_inserted%;
3) INSERT (..., course_based_id) VALUES (..., @x + 1);
4) unlock table;
我建议检查this answer;它适用于 PostgreSQL,而不是 MySQL,但详细描述了一种可能的实现。
更新:以下是实现该行为的一组实际查询示例:
CREATE TABLE tx
(id INT NOT NULL, cid INT NOT NULL, lid INT NOT NULL,
course_based_id INT NOT NULL,
PRIMARY KEY (id),
UNIQUE KEY (cid, course_based_id)
);
LOCK TABLE tx WRITE, tx AS t READ;
INSERT INTO tx (id, cid, lid, course_based_id)
SELECT 2, 2, 1,
1 + COALESCE(
(SELECT MAX(course_based_id)
FROM tx AS t
WHERE cid = 2),
0);
INSERT INTO tx (id, cid, lid, course_based_id)
SELECT 3, 2, 3,
1 + COALESCE(
(SELECT MAX(course_based_id)
FROM tx AS t WHERE cid = 2),
0);
UNLOCK TABLES;
如您所见,没有直接计算下一个 course_based_id 值,但我们在这里得到了序列。