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

时间:2014-05-22 10:55:55

标签: mysql sql-insert insert-select sql-limit

在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个元素,忽略了两个元素重复。

关键是我无法在文档中找到此行为的原因。我发现here LIMIT只有在INSERT...SELECTORDER BY的情况下INSERT IGNORE才能使用INSERT...SELECT。但我无法找到这种行为的准确描述,将ORDER BYLIMIT,{{1}}和{{1}}放在一起。

有人可以帮助我解释这种意想不到的行为吗?

1 个答案:

答案 0 :(得分:0)

Manual for INSERT IGNORE

  

如果您使用IGNORE关键字,则会忽略执行INSERT语句时出现的错误

field_a, field_b)上的TABLE_1可能没有唯一约束。没有这样的约束,可能会发生重复"错误。TABLE_2&# 39; s主键(这是唯一约束的特殊情况)对查询没有影响。

此外,LIMIT n没有ORDER BY"工作",它只会返回查询恰好生成的第一个n随机行。