批量插入原子?

时间:2010-09-09 14:32:17

标签: sql mysql insert lastinsertid

我有自动增量主键表。我想在其中插入一堆数据,并为每个数据获取密钥而无需其他查询。

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 个答案:

答案 0 :(得分:2)

如果您开始一个事务然后将数据插入表中,那么整个表将被锁定到该事务(除非您开始使用事务隔离级别和/或锁定提示)。

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

在大多数情况下,这种“表锁定”是默认行为。

在特殊情况下,您可以发现RDBMS已设置某些选项,这意味着“正常”默认(表锁定)行为不是针对该特定安装所发生的行为。如果是这种情况,您应该能够通过指定您希望将表锁定作为INSERT语句的一部分来覆盖默认值。

修改

我在MS-SQL Server上有很多经验,在许多其他RDBMS上也有丰富的经验。在任何时候我都没有发现任何插件将按特定顺序发生的保证。

这样做的一个原因是可以并行计算INSERT的SELECT部分​​。这意味着要插入的数据已经无序就绪。

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

据我所知,MySQL有一个row_number()类型的函数,您可以在SELECT查询中指定,其结果可以存储在数据库中。然后,您可以依赖于该字段(由您构造),但不能依赖于自动增量ID字段(由RDBMS构建)。

答案 1 :(得分:0)

据我所知,这将适用于几乎所有的SQL引擎。