2017-03-28 11 views
1

特定のイベントでデータベースがINSERTで更新されるアプリケーションが2つのテーブルABにあります。外部キーがid_Aid_BABの多対多の関係をマッピングする追加の関連付け/リンクテーブルABがあります。私の質問は、ABが外部キーの1つがアプリケーションロジック(この場合はAUTO_INCREMENT IDなので)に知られていないときに最もよく更新する方法です。自動増分外部キーを持つMySQL関連テーブルを自動的に更新します。

その他の詳細:

  • はのみid_BAUTO_INCREMENTに設定されているので、その値を挿入する前に知られていません。
  • Bは複数行のINSERTで更新されます。 Aは単一行INSERTです。
  • id_Bは一意のキーですが、古い値を新しいものに置き換えるON DUPLICATE KEY UPDATEによって処理される可能性のある重複があります。
  • Aおよびは、同じイベントに対して同じトランザクションで更新されます。
  • InnoDBを使用するMySQL 5.7。私の考えはABへの最終INSERTLAST_INSERT_ID()からid_Bの値を取得するだろうが、どうやらこれが唯一のマルチ行の最初の行の値を返すストアドプロシージャ内のすべてのINSERT文を含めることでした

挿入:https://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_last-insert-id

ABを更新するロジックを、親テーブルを更新するために使用されているものとは別のトリガーまたは別のステートメントに分けることができます。

編集:コメントへの応答。文の前

+0

Aの各レコードとBの各レコードは、常にABに少なくとも1つのレコードを持ちますか? – toonice

+0

明確にするために、3つのテーブルA、B、A_Bがあります。 –

+0

ところで、1つのSQL INSERT文を使用しない限り、2つのテーブルを同時に挿入することはできません。 1つは常に他のものの前に発生します。 –

答えて

0

(複数可)AB場所に次のステートメントをあなたのデータを挿入するために使用...

SET @before = (SELECT MAX(id_B) AS maxIDB 
       FROM B); 

これは現時点でBid_Bの最大値を検索します。それ以降のすべての挿入はBになり、これより大きな値になります。この事実を我々の利益に利用することができます。上記のINSERT文の場所次の文の後

...

INSERT INTO AB (id_A, 
       id_B) 
SELECT id_A_value, 
     B.id_B 
FROM B 
WHERE B.id_B > @maxIDB; 

注:お使いの上記の質問では、私はid_Aが知られていると仮定しています。私はid_A_valueでこの値を表しています。

このステートメントは、id_Aという既知の値とid_Bのすべての新しく生成された値を含む行をAB行に挿入します。

ご不明な点がございましたら、お気軽にコメントを投稿してください。

関連する問題