4

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

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;
4

2 回答 2

2

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

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

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

在不寻常的情况下,您会发现 RDBMS 设置了某些选项,这意味着“正常”默认(表锁定)行为不适用于特定安装。如果是这种情况,您应该能够通过指定您想要一个表锁作为 INSERT 语句的一部分来覆盖默认值。

编辑:

我在 MS-SQL Server 方面拥有丰富的经验,而在许多其他 RDBMS 方面经验并不丰富。在那段时间里,我没有找到任何保证插入将以特定顺序发生。

原因之一是 INSERT 的 SELECT 部分可以并行计算。这意味着要插入的数据是乱序的。

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

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

于 2010-09-09T15:52:46.643 回答
0

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

于 2010-09-09T14:38:38.237 回答