mariadb 如果插入不成功,是否避免递增主键?

7vux5j2d  于 2022-11-08  发布在  其他
关注(0)|答案(1)|浏览(156)

我有一个'locations'表,如下所示:

使用API,如果我发送一个有效的记录,表将正常地从索引1开始。(无效外键、空字段等),表自然不会接受它,也不会插入任何内容。但是,如果我发送另一条有效记录,而不是ID2,它将使用3进行索引,即使表中只有一条记录,并且没有任何记录被删除,有没有简单的方法可以避免这种情况?
谢谢你!

lfapxunr

lfapxunr1#

请考虑以下情况:您启动一个事务并执行INSERT。INSERT成功,分配了id 2。但是同一事务中的后续查询失败,您必须回滚,包括成功的INSERT。
与此同时,另一个会话也执行自己的插入操作,分配id 3。该事务提交。现在,表中有一行id为3,但没有id为2的行。
你想怎么处理这件事?
a)在提交事务处理之前,阻塞所有并发插入操作。这是确保仅使用连续值所必需的。
b)将自动增量实现为未使用id值的增长列表。该列表应允许增长到多少空间?
事实上,自动增量允许“间隔”或未使用的值是正常的。如果INSERT失败,或者事务回滚,或者您稍后删除了一行,则会在连续的id值序列中留下间隔。
为了提高效率,这是一个必要的折衷方案。自动增量值必须是唯一的,但不要求是连续的。它们不是行号。如果需要保证ID值是连续的,则必须牺牲系统中的其他因素,例如并发INSERT。如果删除一行,您会怎么做?您希望对后面的所有行重新编号吗?
有些人想压缩他们的id值,因为他们担心它们会用完。我看到你的主键是一个BIGINT UNSIGNED。
https://mariadb.com/kb/en/bigint/表示:
不带负数号的范围是0到18446744073709551615。
请记住,如果您从0开始自动递增,并且每秒递增100万次,则BIGINT UNSIGNED将持续18,446,744,073,709秒,即超过584,542年。

相关问题