Oracle10g 触发序列问题

Oracle10g 触发序列问题,oracle10g,Oracle10g,我有一个序列: CREATE SEQUENCE test_seq START WITH 10000001 INCREMENT BY 1; 和一张桌子: create table Entry( id number(5), name varchar(50) ); 在条目表中插入一行之后,我需要增加sequence的值。所以我这样做了: CREATE OR REPLACE TRIGGER test_trigger after INSERT ON Entry REFERENCING NEW AS

我有一个序列:

CREATE SEQUENCE test_seq START WITH 10000001 INCREMENT BY 1;
和一张桌子:

create table Entry(
id number(5),
name varchar(50)  );
在条目表中插入一行之后,我需要增加sequence的值。所以我这样做了:

CREATE OR REPLACE TRIGGER test_trigger
after INSERT
ON Entry
REFERENCING NEW AS NEW
FOR EACH ROW
BEGIN
SELECT test_seq.nextval INTO :NEW.id FROM dual;
END;
/

但是
之后的“”在这里不起作用,而在之前的“”起作用。如何在之后执行此操作?

通常,在INSERT语句中调用sequence.nextval:

INSERT INTO your_table
   (id, ...)
VALUES
   (test_seq.nextval, ...)

是否设置了使用触发器?

通常,在INSERT语句中调用sequence.nextval:

INSERT INTO your_table
   (id, ...)
VALUES
   (test_seq.nextval, ...)

是否已设置使用触发器?

根据,在使用插入后触发器时,不能更新:新值。对不起

根据,使用插入后触发器时不能更新:新值。对不起

如果你真的想在插入后增加序列(这似乎很奇怪),你可以这样做:

CREATE OR REPLACE TRIGGER test_trigger
after INSERT
ON Entry
REFERENCING NEW AS NEW
FOR EACH ROW
DECLARE
    l_id INTEGER;
BEGIN
    SELECT test_seq.nextval INTO l_id FROM dual;
END;
/

当然,这不会将新行的ID设置为该序列值——但是如果您想这样做,您应该将其设置为BEFORE触发器

如果你真的想在插入后增加序列(这似乎很奇怪),你可以这样做:

CREATE OR REPLACE TRIGGER test_trigger
after INSERT
ON Entry
REFERENCING NEW AS NEW
FOR EACH ROW
DECLARE
    l_id INTEGER;
BEGIN
    SELECT test_seq.nextval INTO l_id FROM dual;
END;
/

当然,这不会将新行的ID设置为该序列值——但是如果您想这样做,您应该将其设置为BEFORE触发器

我不明白为什么要在插入后增加序列;这样做会丢失大量的值,因为在会话调用NEXTVAL一次之前,无法在会话中查询序列的上下文CURRVAL

运行以下命令将引发ORA-08002:

create sequence s1;
select s1.currval from dual;

那么,您使用插入后触发器对其进行编码的方式,entry.id的第一个值来自何处?

我不明白您为什么要在插入后增加序列;这样做会丢失大量的值,因为在会话调用NEXTVAL一次之前,无法在会话中查询序列的上下文CURRVAL

运行以下命令将引发ORA-08002:

create sequence s1;
select s1.currval from dual;

那么,按照您使用插入后触发器对其进行编码的方式,entry.id的第一个值来自何处?

为什么?当序列递增时会有什么区别?为什么?当序列递增时会有什么区别?