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;
この答えを確認することをお勧めします; これはMySQLではなくPostgreSQL用ですが、1つの可能な実装について詳細に説明しています。
更新:その動作を実装する実際のクエリセットの例を次に示します。
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
値を直接計算することはできませんが、ここでシーケンスを取得しました。