0

current、、、などの 3 つの関連する MySQL テーブルに挿入する必要がある、たとえば 100 個のアイテムのバッチを受け取りrecentますhistorical。速度を上げるために、単一の挿入ステートメントでグループとして各テーブルに各バッチを挿入したいと考えています。テーブルには、挿入された行ごとに取得する必要currentがある自動インクリメントの主キーがあり、主キーとして使用してとテーブルidに同じ行を挿入します。私の考えは、 の現在の auto_increment 値を取得し、を使用して 100 ずつインクリメントし、「予約」したばかりのブロックからプログラムで設定された ID を使用して 100 行を挿入することです。次に、およびテーブルへの挿入に同じ 100 個の予約済み id 値を使用できます。recenthistoricalcurrentalter table current AUTO_INCREMENT=currentrecenthistoricalcurrentテーブル。

私の質問: これが悪い考えである理由はありますか? 私はウェブ上でそれについて何も見たことがありません。私がスタックオーバーフローで見た中で最も近いのは、自動インクリメントフィールドへの挿入ですが、それはまったく同じではありません。一度に複数のスレッドからこれを実行しようとすると、スレッドの問題が発生する可能性があります。

また、これを達成する方法に関する他の提案も受け付けています。

4

3 に答える 3

0

IDを3つのテーブルから切り離す必要があり、ALTERTABLEを使用するのも非常に厄介だと思います。

私が考えることができる最も適切な方法:

  • recentで、 IDhistoricalを参照する列を追加します。currentプライマリIDを強制的に同じにしようとしないでください。
  • のWRITEテーブルロックを取得しますcurrent
  • のauto_increment値Xを取得しcurrentます。
  • 100レコードを挿入します。これで、IDはX +1からX +100まで実行されます。
  • テーブルロックを解除します。
  • 追加の列に既知のIDを含むレコードrecentを挿入します。historical

注:auto_increment値が次のIDを指しているのか、それとも現在の最大値を指しているのかわかりません。MAX(id)を使用する場合は、上記のコードを使用する必要があります。

于 2013-01-18T17:51:57.483 に答える
0

同時実行の問題が発生する可能性があります。現在の値を取得してから新しい値を設定するまでの間に別の接続が値を挿入すると、重複したキーが取得されます。

ただし、それがあなたの状況で発生する可能性があるかどうか、または挿入が上記のバッチからのみ発生し、並行して実行されている別のインスタンスがないかどうかはわかりません。

于 2013-01-18T17:42:35.050 に答える