2010-12-28 10 views
2

[OK]を、シナリオを説明しましょう。私はそれにauto incr key "orderno"を持つ "orders"テーブルを持っています。テーブルには「orderdate」フィールドもあります。私が望むのはフォーマットされた注文番号です。 YYYYNUMBER様式(注文日に一意の番号を加えたもの)に基づいて(orderno_formatted)ここにはひねりがあります。何のためには、2010年のために存在しない場合、2011年に来年Mysql:年とユニークに基づいて独自のキーの組み合わせを作成する方法

など20103、秩序と1の20101すなわち年になると、その後20102はずです「orderno_formatted」、(orderno_formatted)は20111、20112

ようにする必要があります

これを達成する最良の方法は何ですか?私は知っている、私は最大の番号を検索することができます。多くのユーザーがサイトにアクセスしている可能性がありますが、最大数を取得して保存すると、別のユーザーが同じ番号を取得する可能性があります。

クリア?

ご協力いただきますようお願い申し上げます。あなたのユニーク数は32ビットな長さである

よろしく、

答えて

2

フィールドyearsequenceで別のシーケンステーブルを作成することをお勧めします。その後、実行します。

SELECT sequence FROM year_sequence WHERE year = 2010 FOR UPDATE

をお使いの場合は、同じ行上の任意の連続した選択は... FOR UPDATE(SELECT実行する前に、トランザクションを開始することを忘れないでコミットするために、現在のトランザクションを待ちますように。これは、テーブルをロック自動コミットが有効になっています)。最初の問合せが行を読んでいない場合は、あなたが新しい行を挿入します代わり

UPDATE year_sequence SET sequence = sequence + 1 WHERE year = 2010

:あなたが1で読み取りシーケンス番号をインクリメントし、でそれを押し戻す。この後

次に、COMMITで変更をコミットします。

これで、別のテーブルに挿入するために使用できるシーケンス番号が得られました。その年に一意であることが保証されています。このメソッドを使用することを忘れない限り、次のシーケンス番号。

もう1つの方法は、トランザクションを開始し、最初にシーケンス値を1だけインクリメントするUPDATEを実行し、更新後の同じトランザクションで新しい値を読み込み、その後トランザクションをコミットするだけです。これにより、読み取った値が常に一意になります。これは、新しい値を読み取るまで他のトランザクションが待機するためです。

0

なら、あなたは年間のビットは、この値の最後に、たとえば、あなたは48ビットな長さのユニークな値を持つことができます。

関連する問題