33

cronjob を使用して毎日真夜中に更新されるデータベースがあり、外部 XML から新しいデータを取得します。

私たちがしていることは、すべての新しいコンテンツを挿入し、重複したキーがある場合はそのフィールドを更新することです。

INSERT INTO table (id, col1, col2, col3)
values (id_value, val1, val2, val3),
(id_value, val1, val2, val3),
(id_value, val1, val2, val3),
(id_value, val1, val2, val3),
ON DUPLICATE KEY UPDATE 
col1 = VALUES (col1), 
col2 = VALUES (col2), 
col3 = VALUES (col3);

私たちが知りたいのは、どの行が実際に挿入されたか、つまり、新しい項目のリストが欲しいということです。新しい挿入を返す可能性のあるクエリはありますか? 基本的に、新しい挿入の数ではなく、すべての新しい ID を取得する必要があります。

ありがとう

4

3 に答える 3

40

結果セット内の影響を受ける行の数を調べることで、挿入/更新時にこの情報を取得できます。

MySQLのドキュメントには次のように記載されています。

ON DUPLICATE KEY UPDATE では、行が新しい行として挿入される場合、行ごとの影響を受ける行の値は 1 であり、既存の行が更新される場合は 2 です。

答えを取得して一度に 1 行ずつ挿入するには、ROW_COUNT と LAST_INSERT_ID を組み合わせる必要があります。

于 2012-05-22T20:12:16.440 に答える
8

列を追加しupdate_count INT NOT NULL DEFAULT 1てクエリを変更します。

INSERT
INTO    table (id, col1, col2, col3)
VALUES
(id_value, val1, val2, val3),
(id_value, val1, val2, val3,),
(id_value, val1, val2, val3),
(id_value, val1, val2, val3),
ON DUPLICATE KEY
UPDATE 
        col1 = VALUES (col1), 
        col2 = VALUES (col2), 
        col3 = VALUES (col3),
        update_count = update_count + 1;

BEFORE UPDATEクエリをそのまま保持できるトリガーでインクリメントすることもできます。

于 2012-05-22T20:33:12.703 に答える