加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-12 15:13:21 所属栏目:百科 来源:网络整理
导读:我正在使用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,'a
我正在使用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,并且插入的所有内容都使用序列只有在未来.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读