如果您使用 MyISAM 引擎来存储此表,这可以相对容易地完成:您只需以这种方式定义字段:
cid INT NOT NULL,
course_based_id INT NOT NULL AUTO_INCREMENT,
...
PRIMARY KEY (cid, course_based_id)
然后 any将自动为基于INSERT
分配一个新的(+1)值。这是一个说明这个概念的小提琴。course_based_id
cid
您可以在MySQL 文档中找到有关它的更多信息。
不幸的是,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;
我建议检查这个答案;它适用于 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
值,但我们在这里得到了序列。