【问题标题】:Is the order of inserts specified for INSERT IGNORE ... SELECT?是否为 INSERT IGNORE ... SELECT 指定了插入顺序?
【发布时间】:2019-11-12 10:27:01
【问题描述】:

我有一张这样的桌子:

CREATE TABLE {
  email VARCHAR PRIMARY,
  last_login DATE
}

我可以填充如下选择结果集:

("a@b.c", "2019-01-01"),
("a@b.c", "2019-02-01")

如果我将使用INSERT IGNORE ... SELECT 插入该表,是否指定了插入哪一行以及忽略哪一行?

找到规范:

【问题讨论】:

  • 它被“标记为对基于语句的复制不安全”这一事实表明它可能不是确定性的。

标签: mysql sql sql-insert insert-select


【解决方案1】:

insert 语句没有指定插入行的顺序 - select 语句可以。但是,除非您使用 order by 子句明确定义顺序,否则 select 返回行的顺序完全取决于数据库,不应被信任。

换句话说,如果您关心插入哪一行而忽略哪一行,请在您的select 语句中添加一个order by 子句,并确保您要插入的行排在第一位。

【讨论】:

  • 谢谢。需要明确的是,我在... SELECT 部分使用了ORDER BY。但我不确定选择排序是否被指定为由插入部分“按顺序”处理。
  • @WilliamEntriken 文档没有如此明确地说明,但他们确实使用不带 order by 子句的插入选择声明是不确定的,因此建议您使用 order by(请参阅您链接的文档中的最后三段)。从这里,您可以推断 with order by 子句的行为是确定性的。