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

前端之家收集整理的这篇文章主要介绍了Oracle:max(id)1和sequence.nextval之间的区别前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用Oracle

当我们使用max(id)1创建ID并使用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方法,同时插入两个会话将从表中看到相同的当前最大ID,并且都插入相同的新ID值.安全使用它的唯一方法是在开始事务之前锁定表,这是很痛苦的并且连续化事务. (正如Stijn所指出的那样,如果最高记录被删除,值可以被重用).基本上,从来没有使用这种方法. (可能偶尔有一个令人信服的理由这样做,但我不知道我曾经见过一个).

sequence guarantees that the two sessions will get different values,不需要序列化.它将表现更好,更安全,更易于编码,更易于维护.

您可以使用序列获得重复错误的唯一方法是如果表中已存在ID超过序列值的记录,或者如果某些内容仍然插入不使用序列的记录.所以如果你有一个现有的手工输入ID的表,例如1到10,并且你创建一个默认的start-with值为1的序列,那么使用该序列的第一个插入将尝试插入一个ID已经存在的ID .尝试10次后,顺序会给你11,这将工作.如果然后使用max-ID方法来执行将使用12的下一个插入,但是该序列仍将在11上,并且还将在下次调用nextval时给出12.

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

如果您从手动方法更改为序列方法,则需要确保序列的创建起始值高于表中的所有现有ID,并且插入的所有内容都使用序列只有在未来.

猜你在找的Oracle相关文章