【问题标题】:oracle autoincrement with sequence and trigger is not working correctly带有序列和触发器的 oracle 自动增量无法正常工作
【发布时间】:2012-03-14 18:04:49
【问题描述】:

这是我的问题我有这段代码可以在 oracle 数据库中创建一个自动增量变量:

CREATE TABLE Korisnici
    (
        id_korisnika number PRIMARY KEY,
        ime_korisnika varchar2(200),
        prezime_korisnika varchar2(200),
        broj_telefona varchar2(30),
        adresa_korisnika varchar2(400)
    )
    /

create sequence test_seq
start with 1 
increment by 1;

CREATE OR REPLACE TRIGGER test_trigger
BEFORE INSERT ON Korisnici FOR EACH ROW
BEGIN
  SELECT test_seq.NEXTVAL
  INTO :NEW.id_korisnika
  FROM DUAL;
END;
/

如果我从一开始一切都很好,我的数字是 1,2,3,4.... 我关闭程序,再次打开它,所以再次启动了 oracle 数据库连接。我再添加一个输入,我有像 20,21,22,23 这样的数字...... 我将程序放在我的 android 上并从不同的设备连接,当我输入一个用户时,我有 30,31,33,34...

为什么会这样?以及如何解决?

谢谢

编辑:

这是我从数据库中读取数据的过程

CREATE OR REPLACE PROCEDURE Citanje_korisnika( p_rc OUT SYS_REFCURSOR )
AS
BEGIN
  OPEN p_rc
   FOR SELECT *
         FROM Korisnici;
END;

我是oracle数据库的新手。

【问题讨论】:

  • 如果您提交每笔交易,那么序列会不断增加。它有什么问题?

标签: sql oracle stored-procedures triggers sequence


【解决方案1】:

这不是问题。您可能在序列创建脚本中指定了cache 10。如果您将其更改为nocache,它将有助于弥补差距,但代价是性能受到影响,但它们永远不会完全消失,因为任何回滚完成,并且被杀死的插入等将用完值。请参阅this Ask Tom post

归根结底,这应该无关紧要。如果您依赖完整的序列作为表的键,那么您的数据可能有问题,而不是序列。

【讨论】:

  • @denonth,你没有链接你的触发器和你的程序,所以 proc 什么也没告诉我们。我倾向于同意 cagocowboy 对他的回答的编辑。
【解决方案2】:

使用 NOCACHE 指定 SEQUENCE 将停止一次缓存 20 个数字的会话并提供帮助。

create sequence test_seq
start with 1 
increment by 1
NOCACHE;

但是,如果您希望获得一个完全连续的序列,这很难实现 - 如果(例如)回滚插入,则从序列中获取的数字将“丢失”。


根据您的评论,我想知道您是否忘记提交?

【讨论】:

  • 例如,当我从我的 php 脚本中添加一行时,一切都正确,然后我转到 sql plus 并插入一行,一切顺利。但是当我想用我的 php 脚本读取所有数据时,我只能用 php 脚本插入数据......我会更多地测试你关于 nocache 的答案
猜你喜欢
  • 1970-01-01
  • 2011-11-08
  • 1970-01-01
  • 1970-01-01
  • 2017-08-04
  • 1970-01-01
  • 2016-05-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多