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是一个临时表,用来存储一些元组,然后清空。它没有主键。

由于该进程多次填充表,因此它可能包含通过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 个元素,忽略了两个重复项。

关键是我在文档中找不到这种行为的原因。我在这里发现只有当我有一个 时才LIMIT有效。但是我无法找到对这种行为的精确描述,同时具有,和.INSERT...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 BY“作品”,它只会返回n查询恰好生成的第一个随机行。

于 2014-05-22T11:08:17.693 回答