PHPでmysqlを使用しています。私はこのような学生のテーブルを持っています。InnoDBエンジンを使用しています。
id int AUTO_INCREMENT
regno int
name varchar
新しい学生が挿入されるたびに、次に利用可能なレグノを割り当てたいと思います。たとえば、前の学生のregnoが1の場合、次のエントリの値は2になります。自動インクリメントは、ギャップを作成する可能性があるため、ここでは機能しません。(私はトランザクションを使用しているので、studentsテーブルに行を挿入した後、ロールバックを引き起こす可能性のあるクエリがさらにいくつかあります。この場合、実際のレコードは挿入されませんが、自動インクリメントIDがインクリメントされます)。また、古いレグノの間にギャップがあるかどうかは気にしません...たとえば、レグノには1、2、3、5、10、11、12のシーケンスがある場合があります。次の生徒が挿入されたら、この生徒に12 + 1=13を希望します。また、regnoが重複していないことを確認したいと思います。(regnoにはUNIQUEインデックスがありますが、エラーをスローしたくありません。次の番号を取得する必要があります)。
私は2つの解決策を念頭に置いています。1 :(擬似コード)a。newregno = max(regno)+1のデータベースのクエリb。行を挿入するときに、newregnoをstudentに割り当てます。
この場合、アプリケーションの2つのインスタンスが同時にデータベースにクエリを実行し、同じnewregnoを取得して重複を引き起こす可能性があることを懸念しています。
2:トリガーを使用...実際の行の挿入後にレグノを更新します。(私はトリガーについてあまり読んでいませんが、誰かがこれがより良いアプローチであると示唆するなら、私はそれを選びます)
なにか提案を?
編集---regno(登録番号)は、将来的には一意ではない可能性がありますが、コース/セッションなどの他の列とともに一意になります。したがって、「自動増分」インデックスタイプのソリューションを提供しないでください。