2016-06-15 23 views
0

私のSQLデータベースには2つのデータベーステーブルがあります。最初のものは個人的なテーブルであり、他のものは支払いの詳細です。個人テーブルの自動入力IDは、支払詳細の外部キーとして使用されます。私はこのテーブルに2つのデータを挿入する必要があります.normaly私は個人的なテーブルにinsertdataし、この行の自動インクリメントIDを取得し、支払いデータテーブルにデータを挿入する必要があります。しかし、私はいくつかの問題があります。mysql&php auto idを増やしてデータを挿入する

  • て確認するより多くのcolumsがあるeasily.because私はSQLのSELECTクエリ を使用して自動インクリメントIDを取得することはできません。
  • 最後のインサートIDは完全な方法ではありません。他のユーザーが私がアクセスしている間に別の人のデータを挿入して間違ったIDを受け取る可能性があるためです。

私はこれについてよく知っていません。助けて !

+2

あなたが試したものを挿入してください –

答えて

1

あなたの構造は本当にわかりませんが、ここでの最良の方法はトランザクションを使用することです。リンク:http://dev.mysql.com/doc/refman/5.7/en/commit.html

START TRANSACTION; 
INSERT /* Your insertion into personalTable */ 
SELECT @lastId:=LAST_INSERT_ID(); 
INSERT INTO paymentTable SET (user_id) VALUES (@lastId); 
COMMIT; 

また、トランザクション違反を防ぐために、TRANSACTION ISOLATION LEVELをSERIALIZABLEに設定する必要があります。

UPD。私が深く掘り下げるように@Drewに感謝します。

+0

いいえ、遠隔地として問題の可能性はありません。行3の挿入と変数の保存の間に、別のユーザーが挿入を実行した可能性があります。そのデータを安全に取得するために 'LAST_INSERT_ID()'を使います。この関数は、*あなたの*クライアント接続の最後の挿入IDを返します。 – Drew

+0

あなたはそうですが、LAST_INSERT_ID()は、このトランザクションが動作している間に挿入を防止することはできません。ここでの最適な方法は、独立性レベルをSERIALIZABLEに設定することです。トランザクションは完全に独立しています。 https://dev.mysql.com/doc/refman/5.5/en/set-transaction.html – jaro1989

+0

なぜインサートを防止したいのですか?私たちはすべての場合に正しい '@ lastId'を取得しようとしており、あなたの答えは間違っています。 – Drew

関連する問題