簡體   English   中英

在MySql中INSERT IGNORE ... SELECT ... ORDER BY ... LIMIT ...的確切行為是什么?

[英]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 BYLIMIT才能在INSERT...SELECT工作。 但我無法找到這種行為的精確描述,一起INSERT IGNOREINSERT...SELECTORDER BYLIMIT

有人可以幫我解釋一下這種意想不到的行為嗎?

INSERT IGNORE手冊

如果使用IGNORE關鍵字,則會忽略執行INSERT語句時發生的錯誤

TABLE_1上的( field_a, field_b)可能沒有唯一約束。 沒有這樣的約束,不會發生“重復”錯誤。 TABLE_2的主鍵(這是唯一約束的特殊情況)對查詢沒有影響。

此外, LIMIT n沒有ORDER BY “工作”,它只返回查詢恰好生成的前n隨機行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM