我有自动增量主键表。我想在其中插入一堆数据,并为每个数据获取密钥而无需其他查询。
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;
答案 0 :(得分:2)
如果您开始一个事务然后将数据插入表中,那么整个表将被锁定到该事务(除非您开始使用事务隔离级别和/或锁定提示)。
这基本上是交易的重点。防止外部操作(无论如何)改变您正在操作的操作。
在大多数情况下,这种“表锁定”是默认行为。
在特殊情况下,您可以发现RDBMS已设置某些选项,这意味着“正常”默认(表锁定)行为不是针对该特定安装所发生的行为。如果是这种情况,您应该能够通过指定您希望将表锁定作为INSERT语句的一部分来覆盖默认值。
修改强>
我在MS-SQL Server上有很多经验,在许多其他RDBMS上也有丰富的经验。在任何时候我都没有发现任何插件将按特定顺序发生的保证。
这样做的一个原因是可以并行计算INSERT的SELECT部分。这意味着要插入的数据已经无序就绪。
同样,在插入特别大量的数据的情况下,RDBMS可以识别新数据将跨越几页内存或磁盘空间。同样,这可能导致并行操作。
据我所知,MySQL有一个row_number()类型的函数,您可以在SELECT查询中指定,其结果可以存储在数据库中。然后,您可以依赖于该字段(由您构造),但不能依赖于自动增量ID字段(由RDBMS构建)。
答案 1 :(得分:0)
据我所知,这将适用于几乎所有的SQL引擎。