2010-12-04 38 views
1

私は現在ASPとMySQLを使用している大きなWebプロジェクトに取り組んでいます。 複数のテーブルに挿入するとき、私はlast_update_ID()を使用していましたが、いくつかの調査の後で、そのSQL文が安全でないことがわかりました。mySQLの "last_update_ID()"の代替手段はありますか?

So.問題: 異なるインターネット接続を持つ2つの異なるコンピュータを使用しています。
両方のコンピュータが、現在構築しているシステムにログオンしています。私はconnection_id()とlast_update_idを出力するページを作った。
いずれかのコンピュータでテーブルを更新すると、もう一方のテーブルもlast_update_IDを取得します。 両方のコンピュータのconnection_IDは同じです。

これを回避するにはどうすればよいですか?

最初のINSERTの後にselect文を実行したくない場合(必要でない場合)は不要です。挿入した行を検索して、その行の正しいIDを取得します。

私は使用しているサーバーではないため、データベースを大幅に変更することはできません。
ウェブページが同じloginName &パスワードを使用してデータベースに接続するため、この問題が発生していると思いますか?

最終更新IDを取得する他の方法はありますか?それは完全に安全です。 私はASPページの最後にすべての接続を閉じます。 connection_IDは変更されません。
接続IDは、サーバー上の別のWebページを開いても、数分間です。

答えて

3

LAST_INSERT_ID()が現在のセッションで正しいと思います。したがって、各セッションはそれ自身の正しい値を受け取ります。私はあなたの質問を理解していないか、あなたは問題があると思いますが、あなたはそうではないと思います。

私はLAST_UPDATE_ID()関数を認識していませんが、更新時に同じWHERE句(更新前)を使用して更新された行を簡単に取得できますか?

参照:LAST_INSERT_IDについてhttp://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html

()は、最も 最近生成されたIDは、接続ごとに サーバに維持されます。 他のクライアントは変更しません。 が非マジック値 (つまり、NULLでなく0でない値)の別のAUTO_INCREMENT列を更新すると、変更されません。複数の クライアントから同時に LAST_INSERT_ID()およびAUTO_INCREMENT 列を使用すると完全に有効です。各 クライアントは、最後の文の最後に挿入された IDを受信します。 クライアントが実行されました。


あなたはON DUPLICATE KEY UPDATE句を持つINSERTクエリからLAST_INSERT_IDを取得する場合、あなたはまた、更新されたAUTO_INCREMENTカラムの値を取得するために、LAST_INSERT_ID()関数を使用することができます。

参照:http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

テーブルがAUTO_INCREMENT カラムおよびINSERTを含む場合... UPDATEは 行、LAST_INSERT_Iを挿入D()関数 はAUTO_INCREMENT値を返します。 ステートメントが行を代わりに更新する場合は、 LAST_INSERT_ID()は意味がありません。 ただし、LAST_INSERT_ID(expr)を使用して でこれを回避することができます。 がidがAUTO_INCREMENT列であるとします。

INSERT INTO table (a,b,c) VALUES (1,2,3) 
    ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), c=3; 
+0

実際に私は問題があると思う..私は2つの異なるコンピュータと2つの異なるインターネット接続を使用し、私は更新またはテーブルに挿入する他のコンピュータのwhemからlast_update_ID()を取得することができます。 – Matte

+0

その後、grahamparksからの回答があなたのケースに当てはまります。永続接続/接続プーリングを使用しています。ただし、エンドツーエンドでのみ使用されます。あなたはその主題を読むことができます。 – ontrack

1

サーバーには接続プールがオンになっているように見えます:LAST_INSERT_ID()の更新のための有意義な 、次のように行を挿入するに作る 。つまり、スクリプトの終了後にデータベース接続が開いていて、それに伴って次のスクリプトが使用されるため、その接続に設定されている変数(LAST_INSERT_ID()など)を見ることができます。

同時に起こることはない2つのスクリプトインスタンスが同時に接続を共有することです。したがって、サーバーが2つのスクリプトインスタンスを正確に同時に実行する必要がある場合は、2番目のデータベース接続を作成し、別のLAST_INSERT_ID()という別の変数を使用して、最初のデータベース接続に干渉しません。

つまり、INSERTLAST_INSER_ID()のリクエストが同じスクリプト内で発生していれば(しかもそれらの間のデータベース接続を何らかの形で閉じていない限り)、スクリプトは完全に安全です接続。

関連する問題