2012-06-07 11 views
9

私はBINARY(20)の主キーを持つ非常に大きなテーブルを持っています。ON DUPLICATE KEY UPDATE用に挿入された行数の取得複数の挿入?

テーブルには約1700万行があります。毎時cronジョブは、ON_DUPLICATE_KEY_UPDATE構文を使用して、このテーブルに最大50,000の新しいエントリを挿入しようとします。

クロムジョブの各インサートは1,000個の値(複数のインサート)です。このクエリからテーブルに挿入された行の数を取得するにはどうすればよいですか?私は前後に行数を行うことはできません。なぜなら、約1700万行があり、クエリが高すぎるからです。 2000 - 行は行の影響を受けた数が1であり、それは私が1000年に至るまで、影響を受けた行を持つことができDUPLICATE KEY UPDATEクエリON私の1000年INSERTで意味を、2で更新フィールドの挿入のためのマニュアルMySQLで

氏は述べていますこの番号からいくつのレコードが挿入されたのかわからないのですか?

どうすればこの問題を解決できますか?

ありがとうございました

答えて

11

挿入の数から影響を受けた行の数を差し引いた数です。より一般的には:

(numberOfValuesInInsert * 2) - mysql_affected_rows() 

EDIT:tomas points outとして

MySQL docsが実際に言う:行あればON DUPLICATE KEY UPDATEと

を、行ごとに影響を受ける、列の値が1であります既存の行が更新された場合は新しい行として挿入され、既存の行が現在の値に設定されている場合は、および0が挿入されます。

したがって[重点鉱山]、同じ値に既存の行を設定する可能性がある場合、それは2つのインサートは、一方から区別できないであろうため、対を挿入、更新された行数を指示することは不可能です異なる値で更新する+同じ値で更新する

+0

私の数学は最高ではありません、私はこの笑い声の中で私の頭を得ることはできません、私はいくつかのテスト、おかげでやります。 – Griff

+0

確かにあなたは正しいおかげで、私の一日を節約できました:) – Griff

+0

このasnwerは、各行に1または2のいずれかを取得することを前提としています。 INSERT ... ON DUPLICATE KEY UPDATEステートメントの場合、行ごとの影響を受ける行の値は、行が新しい行として挿入されている場合は1、既存の行が更新されている場合は2、既存の行が現在の値に設定されています 既存の行が変更されていない場合は、0が得られ、これは機能しません:/ – tomas

6

ジョブが1000の挿入を実行する場合、ON_DUPLICATE_KEY_UPDATEを持つようにいくつかは純粋な挿入物であり、いくつかは更新です。 は、このように、あなたは最初の方程式に取得しない

(1)挿入+アップデート=

は、私はあなたがmy_sql_affected_rows 1350の値を取得する簡単な例を取る(この場合は1000)挿入された行のん。 Insertでは値1、更新では2の値がmy_sql_affected_rowsに集約されるためです。私は次の方程式を得る。

(2)挿入+ 2 * Updates = my_sql_affected_rows(この場合は1350)。

減算(2) - (1)。あなたが得る

(3)アップデート= my_sql_affected_rows - ノー

挿入された行のアップデート= 1350年から1000年(この例では)。

Updates = 350。

式のアップデートの代替値(1)、あなたはこのようにアップデートの数を取得するには、あなただけの直接式(3)を使用する必要があり

挿入= 650

を取得します。

+0

これは、挿入と更新の両方があることを前提としていますが、常にそうであるとは限りません。他のケースの1つになることができます:挿入のみ、更新のみ、挿入も更新もありません。これらのケースで純粋なインサートの数を調べることは可能ですか? – satoru

+0

式(1)は、行が現在の値に設定されている場合は0になるため、ここでは正確ではありません。(1)挿入+更新+未変更=挿入された行はありません。 3つの変数を与え、これを解決できないようにする:/ – tomas