在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...SELECT
有ORDER BY
的情况下INSERT IGNORE
才能使用INSERT...SELECT
。但我无法找到这种行为的准确描述,将ORDER BY
,LIMIT
,{{1}}和{{1}}放在一起。
有人可以帮助我解释这种意想不到的行为吗?
答案 0 :(得分:0)
如果您使用
IGNORE
关键字,则会忽略执行INSERT
语句时出现的错误。
field_a, field_b)
上的TABLE_1
可能没有唯一约束。没有这样的约束,可能会发生重复"错误。TABLE_2
&# 39; s主键(这是唯一约束的特殊情况)对查询没有影响。
此外,LIMIT n
没有ORDER BY
"工作",它只会返回查询恰好生成的第一个n
随机行。