-1

在庫テーブル (小売店の製品/在庫用) とシリアル テーブル (在庫ごとに発行されたバーコード) があります。

基本的に、新しい株がデータベースに導入されると、システムは各株のシリアル番号を発行します...シリアルテーブルのインデックス/プライ自動インクリメント値に基づいています。

問題は、両者が互いに依存していることです...

説明します:

STOCKS TABLE
stock_id int(11) 
product_name varchar(50)
serial int(30) <--- relies on the serials generated by system, stored in the SERIALS TABLE 


SERIALS
sn_id int(11)
stock_id int(11) <-- relies on the new stocks inserted in the stocks table
serial int(30) <---- serial NO generated for specific stock.

STOCKS が挿入される場所には、生成されたシリアル番号を格納する必要があり、生成された SERIALS は、挿入される株式の stock_id (index/pri) と共にテーブルに記録する必要があります。

これは基本的に、3 つの SQL ステートメント/新しい在庫を意味します。

  1. serials テーブルの次の auto inc 値を取得します (シリアルを適切に生成するために使用されます)
  2. それぞれのシリアル番号を持つテーブルに株式を挿入します
  3. 上記の株式のinsert_idを取得し、それをserialsテーブルに挿入します

これは機能しますが、より良いアプローチがあるかどうか疑問に思っていますか? これまでのところ、私が実行したものは次のとおりです。

  1. ホームディレクトリにserial_lockファイルを作成します(これにより、他のスクリプトが新しいシリアル番号を他の株に発行するのを防ぎます=同時実行での競合を回避します..

  2. serials テーブルの次の auto_increment 値を取得して必要なシリアル番号を生成し、これを変数に保存します。

     $assigned_serials_array[$index] = $prefix . $index; // results in BN-0001 ("BN-" is the prefix and the rest is padded auto inc value incremented per loop
    
  3. INSERT INTO 株式、各株式、insert_ID を取得します。

  4. INSERT INTO serials、その特定の株に発行されたシリアルの記録
  5. ループが完了したら、ロックファイルを削除します

PS。
私のオリジナルは、実際には既にシリアル テーブルに INSERT を実行し、stock_id が生成された後にそのシリアル テーブルを更新します。別の SQL ステートメントが発行されているため、それが最も安全な方法ではありますが、私はそれを快適に感じませんでした。ただし、ロックファイルと競合について心配する必要はありません。

うーん..何か考えはありますか?

編集:
私は自分の方法を変更することにしました..
各SERIAL GENERATEDはSTOCK(stock_id)..シリアル番号00001 0002 0003のインクリメンタルシーケンスを忘れることにしました

先に進み、SN が発行されている特定の株式の stock_id を使用することにしました。

そう..
次の挿入IDを取得し、それに基づいてSNを生成し、
INSERT STOCK 、生成されたSN
INSERT SERIALレコードを使用して、stock_idを同じ次の挿入IDにも参照します..

終わり!

私は本当に完全にシーケンスされた SN が欲しかった..

4

1 に答える 1

1

ロック ファイルを作成しないでください。これは間違っています。

代わりに、トランザクションを使用してください。Perl でのこの例:

my $dbh = DBI->connect("dbi:mysql...", "user", "password");
$dbh->begin_work();  # start new transaction
$dbh->do("INSERT INTO serials ..."); # generate new serial
my $new_serial = $dbh->{mysql_insertid};
$dbh->do("INSERT INTO stocks (..., serialno) VALUES (..., $new_serial)");
# do some more work like inserting into other tables
$dbh->commit();  # finally, commit the transaction

トランザクションが機能するには InnoDB エンジンを使用する必要があることに注意してください

于 2012-11-13T07:01:59.523 に答える