次の形式で請求書番号を作成する必要があります。
CONSTANT_STRING/%d/mm/yyyy
mm-月(2桁)yyyy-年
現在、%dは特定の月の請求書の番号です。つまり、この番号は毎月リセットされます。
今月の最大数をデータベースでチェックしています。次に、インクリメント後、行を保存します。
整数が一意である必要があります。ただし、複製されている場合があります(2人のユーザーが同時に保存します)。
助言がありますか?
フィールドに一意のインデックスを配置し、2 番目のインスタンスを保存しようとしたときにデータベース エラーをキャッチします。また、可能な限り最後の瞬間まで値の取得を延期します。
1 つの解決策はSELECT ... FOR UPDATE
、更新するまで行をブロックしますが、深刻なマルチタスク アプリケーションでデッドロックを引き起こす可能性があります。
最善の方法は、トランザクションで数値を取得して増分してから作業を開始することです。このようにして、行は長時間ロックされません。
BEGIN WORK
と を調べCOMMIT
ます。
請求書テーブルの主キー (できればINT
) を使用するか、たとえば を介して各請求書に一意の番号を割り当てますuniqid
。
PS。を使用している場合は、パラメータを に設定することで一意性uniqid
を高めることができます。more_entropy
true
set the id all in one query.
$query = 'INSERT INTO table (invoice_number) VALUES (CONCAT(\''.CONSTANT.'\', \'/\', (SELECT COUNT(*) + 1 AS current_id FROM table WHERE MONTH(entry_date) = \''.date('n').'\' AND YEAR(entry_date) = \''.date('Y').'\'), \'/\', \''.date('m/Y').'\'))';