代码之家  ›  专栏  ›  技术社区  ›  Andrew

批量插入是原子的吗?

  •  4
  • Andrew  · 技术社区  · 15 年前

    我有一个主键自动递增的表。我想在其中插入一堆数据,并在不需要额外查询的情况下获取每个数据的密钥。

    START TRANSACTION;
    INSERT INTO table (value) VALUES (x),(y),(z);
    SELECT LAST_INSERT_ID() AS last_id;
    COMMIT;
    

    MySQL能保证所有的数据都被插入到一个连续的有序流中吗,这样我就可以很容易地计算每个元素的id了?

    id(z) = last_id;
    id(y) = last_id - 1;
    id(x) = last_id - 2;
    
    2 回复  |  直到 15 年前
        1
  •  2
  •   MatBailie    15 年前

    这是基本的交易点。防止外部操作(无论如何)改变您正在操作的操作。

    我在MS-SQL Server上有很多经验,在许多其他RDBMS上也有零星的经验。在这段时间里,我没有找到任何保证,插入将发生在一个特定的顺序。

    其中一个原因是可以并行计算INSERT的SELECT部分。这就意味着要插入的数据已经准备好了。

    同样地,在插入特别大的数据量的地方,RDBMS可以识别新数据将跨越多页内存或磁盘空间。同样,这可能导致并行操作。

        2
  •  0
  •   jwueller    15 年前