3

MySql 5.6 には、次のようなクエリがあります。

INSERT IGNORE INTO TABLE_1 (field_a,field_b)
SELECT field_a,field_b
FROM TABLE_2
WHERE
...
ORDER BY field_a
LIMIT 0,10

TABLE_1一部のタプルを格納してから空にするために使用される一時テーブルです。PRIMARY KEY はありません。

プロセスはテーブルを複数回埋めるため、SELECT. これを考慮して、必要なすべてのデータを挿入できるように、制限を増やすことを考えました。

TABLE_1クエリの内容と結果の例を次に示しSELECTます。

TABLE_1:

+---------+---------+
| field_a | field_b |
+---------+---------+
| foo     | 1       |
| foo     | 2       |
| foo     | 3       |
| foo     | 4       |
| bar     | 2       |
| bar     | 3       |
| bar     | 4       |
| bar     | 5       |
+---------+---------+

SELECT結果 ( を無視LIMIT):

+---------+---------+
| field_a | field_b |
+---------+---------+
| foo     | 4       |
| foo     | 5       |
| foo     | 6       |
| foo     | 7       |
| foo     | 8       |
| foo     | 9       |
| foo     | 10      |
| foo     | 11      |
| foo     | 12      |
| foo     | 13      |
| bar     | 5       |
| bar     | 6       |
| bar     | 7       |
| bar     | 8       |
+---------+---------+

したがって、2 つの重複するタプルが存在することを考慮する(foo,4)(bar,5)、8 つの要素が挿入されると予想していましたが、実際には、2 つの重複を無視して、クエリで 10 の要素が挿入されていることがわかりました。

ポイントは、ドキュメントでこの動作の理由を見つけることができないということです。私が持っているがある場合にのみ機能するここを見つけました。しかし、 、、およびを一緒に持つこの動作の正確な説明を見つけることができませんでした。LIMITINSERT...SELECTORDER BYINSERT IGNOREINSERT...SELECTORDER BYLIMIT

誰かがこの予期しない動作を説明するのを手伝ってくれますか?

4

1 に答える 1

0

マニュアルINSERT IGNORE:

IGNOREキーワードを使用すると、ステートメントの実行中に発生したエラーは無視されます。INSERT

field_a, field_b)( on に一意の制約がない可能性がありTABLE_1ます。そのような制約がなければ、「重複」エラーは発生しません。TABLE_2主キー (一意の制約の特殊なケース) はクエリに影響しません。

また、「動作」がLIMIT nなければ、クエリがたまたま生成した最初のランダムな行を返すだけです。ORDER BYn

于 2014-05-22T11:08:17.693 に答える