gpt4 book ai didi

Oracle:max(id)+1 和 sequence.nextval 之间的区别

转载 作者:行者123 更新时间:2023-12-03 22:48:40 31 4
gpt4 key购买 nike

我正在使用甲骨文

我们创建时有什么不同ID使用 max(id)+1并使用 sequance.nexval ,在哪里使用,何时使用?

喜欢:

insert into student (id,name) values (select max(id)+1 from student, 'abc');


insert into student (id,name) values (SQ_STUDENT.nextval, 'abc');
SQ_STUDENT.nextval有时会出现重复记录的错误...

请帮助我解决这个疑问

最佳答案

select max(id) + 1方法,同时插入的两个 session 将从表中看到相同的当前最大 ID,并且都插入相同的新 ID 值。安全使用它的唯一方法是在开始事务之前锁定表,这很痛苦并且会序列化事务。 (正如 Stijn 指出的那样,如果删除最高记录,则可以重用值)。基本上,永远不要使用这种方法。 (偶尔可能有一个令人信服的理由这样做,但我不确定我是否见过)。

sequence guarantees that the two sessions will get different values ,并且不需要序列化。它将表现得更好,更安全,更容易编码和更容易维护。

使用序列获得重复错误的唯一方法是表中已存在 ID 高于序列值的记录,或者某些内容仍在插入记录而不使用序列。因此,如果您有一个手动输入 ID 的现有表,比如 1 到 10,并且您创建了一个默认起始值​​为 1 的序列,则使用该序列的第一个插入将尝试插入一个 ID 为 1 - 它已经存在.在尝试了 10 次之后,序列会给你 11,这会起作用。如果您随后使用 max-ID 方法进行下一个将使用 12 的插入,但序列仍将在 11 上,并且下次您调用 nextval 时也会为您提供 12。 .

序列和表没有关系。如果将手动生成的 ID 值插入到表中,则序列不会自动更新,因此这两种方法不会混合。 (除其他外,如文档中所述,相同的序列可用于为多个表生成 ID)。

如果您要从手动方法更改为序列方法,则需要确保创建的序列的起始值高于表中所有现有 ID,并且执行插入的所有操作都使用该序列只有在 future 。

关于Oracle:max(id)+1 和 sequence.nextval 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17210835/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com