`INSERT…ON DUPLICATE KEY UPDATE`で2行が影響を受けるのはなぜですか?


89

私がやっているINSERT ... ON DUPLICATE KEY UPDATEためにPRIMARY KEY、次の表に:

DESCRIBE users_interests;
+------------+---------------------------------+------+-----+---------+-------+
| Field      | Type                            | Null | Key | Default | Extra |
+------------+---------------------------------+------+-----+---------+-------+
| uid        | int(11)                         | NO   | PRI | NULL    |       |
| iid        | int(11)                         | NO   | PRI | NULL    |       |
| preference | enum('like','dislike','ignore') | YES  |     | NULL    |       |
+------------+---------------------------------+------+-----+---------+-------+

ただし、これらの値は一意である必要がありますが、2つの行が影響を受けています。

INSERT INTO users_interests (uid, iid, preference) VALUES (2, 2, 'like')
ON DUPLICATE KEY UPDATE preference='like';
Query OK, 2 rows affected (0.04 sec)

なぜこうなった?

編集

比較については、次のクエリを参照してください。

UPDATE users_interests SET preference='like' WHERE uid=2 AND iid=2;
Query OK, 1 row affected (0.44 sec)
Rows matched: 1  Changed: 1  Warnings: 0

そもそもなぜ2つの主キーがあるのですか?
ペッカ

1
@Pekka、両方の値がわかっているときにほとんどのクエリが実行されるため、これPRIMARY KEYはで作成された単一のpkです(uid, iid)
ジョシュ・スミス

1
@Joshなるほど。マニュアルにはかかわらず、それを阻止するようだ:In general, you should try to avoid using an ON DUPLICATE KEY UPDATE clause on tables with multiple unique indexes.んが、それは主キーである必要が?通常のインデックスではないのですか?
ペッカ

@Pekka、正直なところわかりません。私はまだこれに比較的新しいです。この場合、インデックスはより意味がありますか?
ジョシュ・スミス

3
@ジョシュうん、両方の列にまたがる通常のインデックスはここでうまく機能するはずです
Pekka

回答:


198

マニュアルから:

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


14
また、既存の行が現在の値に設定されている場合は0。
Svish

1
@Svish、ありがとう!これは本当に役に立ちます。
Green

1
私はちょうどそれはそれはあまり混乱させるために影響を受けた行の応答コードの代わりに、数として返されている可能性が明らかに...その背後にある論理的根拠がどうなるか疑問に思う
Sudipバンダリ

...:|。影響を受ける行の実際の数を決定する方法はありますか?既存の行が更新されても、影響を受ける行は1つだけです
Ulad Kasach

これはバッチ挿入でも同じですか?… VALUES (2, 2, 'like'), (3, 3, 'like'), (4, 4, 'like') ON DUPLICATE …
ラッキードナルド

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.