sql – 批量插入原子?

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

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;

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

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

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

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

编辑:

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

其中一个原因是可以并行计算INSERT的SELECT部分​​.这意味着要插入的数据是无序的.

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

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

点赞