2016-12-08 12 views
0

私は各店舗に請求書の一連の番号を設定する必要がある複数の店舗を持つシステムを設計しています。当然のことながら、私のプライマリID列はシステム内のすべての請求書に対して順次になるので、明らかに、この「店舗固有の」請求書番号を格納する別の列が必要になります。この店舗固有の番号の次のIDを保存して取得するには、どのような方法が良いですか?たとえば、単に請求書表からSELECT MAX(INV_NUM) FROM INVOICES WHERE SHOP_ID = #のような行為をして、それを追加してから新しい請求書レコードを作成するのは安全でしょうか?または、スクリプトの2つのインスタンスを同時に実行する場合、タイミングに問題がありますか?たとえば、最初のスクリプトは次のIDを取得しますが、新しい請求書レコードを作成する前に、2番目のインスタンスが次のIDを要求し、最初のスクリプトと同じIDを取得します。次の請求書番号を要求するとすぐに新しい次の注文番号を書き込んで保存し、次の注文番号を取得してから次の要求が依存するレコードを作成するまでの時間をコードの絶対最小...文字通り3行:データベース内のシーケンス番号を持つ2番目の列

$nextId = $shop->getLastId() + 1; 
$shop->setLastId($nextId); 
$em->persist(); 

請求書

------------------------------ 
| ID | INV_NUM | SHOP_ID | 
------------------------------ 
| 1 |  99 |  1 | 
| 2 |  100 |  2 | 
| 3 |  100 |  1 | 

件のショップ

------------------- 
| ID | LAST_ID | 
------------------- 
| 1 |  100 | 
| 2 |  100 | 
+0

MyISAMを使用している場合の1つのオプションは次のとおりです。http://stackoverflow.com/questions/677542/auto-increment-by-group –

+0

通常、このためにトリガーを使用します。 –

+0

@ GordonLinoffしかし、彼はどのようにして同じテーブルでトリガーを使うことができましたか? –

答えて

1

あなたは私はあなたが、あなたがlifecycle eventsあなたのエンティティの変更をリッスンすることができsymfonyのを使用しているので、あなたがいると仮定し教義を、使用している場合。保存する前に、2番目の列を増分値に更新できます。

レースコンディションに関して、あなたのデータベースに悪いデータがないことを確かめるために、お店のIDと請求書番号にunique constraintを入れることができます。

関連する問題