[英]What is the exact behaviour of an INSERT IGNORE… SELECT… ORDER BY… LIMIT… in MySql?
在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 |
+---------+---------+
因此,考慮到有兩個重復的元組, (foo,4)
和(bar,5)
,我期望插入8個元素...而實際上,我發現查詢插入了10個元素,忽略了兩個重復元素。
關鍵是我無法在文檔中找到此行為的原因。 我在這里發現,只有存在ORDER BY
, LIMIT
才能在INSERT...SELECT
工作。 但我無法找到這種行為的精確描述,一起INSERT IGNORE
, INSERT...SELECT
, ORDER BY
和LIMIT
。
有人可以幫我解釋一下這種意想不到的行為嗎?
如果使用
IGNORE
關鍵字,則會忽略執行INSERT
語句時發生的錯誤 。
TABLE_1
上的( field_a, field_b)
可能沒有唯一約束。 沒有這樣的約束,不會發生“重復”錯誤。 TABLE_2
的主鍵(這是唯一約束的特殊情況)對查詢沒有影響。
此外, LIMIT n
沒有ORDER BY
“工作”,它只返回查詢恰好生成的前n
隨機行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.