Nat*_*tan 3 mysql mariadb auto-increment
假设我有一个带有 auto_increment 列的表,然后在单个语句中插入多个值:
insert into foo (bar) values ('a'), ('b'), ('c');
从文档中,last_insert_id()返回查询的第一个生成的 ID,a在本例中为 ID 。
mysql 是否保证 ab和c将被分配顺序值?
换句话说,如果 last_insert_id() 返回 1 for a,是否有任何保证 b = 2 和 c = 3?或者是否存在由于多个并发插入而导致的结果,例如“a = 1, b = 5, c = 9”?
是的,对于那个特定的语句,MySQL 知道将要插入多少行,并且使用锁和/或互斥锁来检索要在查询开始时插入的 id。它是完全确定的,并且值将是连续的。
但是,根据变量innodb_autoinc_lock_mode,其他非平凡的插入像 insert... on duplicate key update并且insert... select 可能无法保证确定性行为(因为它们可能不知道要插入的实际行数)。这是为了通过牺牲连续值来允许额外的并发性。在所有情况下,整个表都保证了唯一的、单调递增的值,只是在某些情况下可能存在间隙和交错。
您可以在手册中了解有关innodb autoinc 行为的更多信息。您还可以通过执行以下操作在实践中对其进行测试:
$ mysql test -e "INSERT INTO test (session) VALUES (1), (sleep(1)), (1)"
Run Code Online (Sandbox Code Playgroud)
当您尽可能快地同时插入其他值时。
附录:我刚刚意识到一个你不能假设的情况:如果你使用 auto_increment_offset :-)
| 归档时间: |
|
| 查看次数: |
3137 次 |
| 最近记录: |