2017-09-04 54 views
0

正如我在标题中所描述的那样,我想写一个触发器来定义添加一个新的人员,除了ID之外的所有属性,我想要触发生成并自动插入它。我怎样才能做到这一点?如何定义插入新人时自动生成id的触发器?

我已经在PL/SQL中编写了如下所示的代码,但它包含了序列,我无法找到如何使用序列获取我的员工的当前最大ID,那么请你帮助我,是否使用序列?

CREATE SEQUENCE BEFORE_INSERTING START WITH 1000 INCREMENT BY 1; 

CREATE OR REPLACE TRIGGER NEW_ID_BEFORE_INSERTING 
BEFORE INSERT ON STAFF 
FOR EACH ROW 
BEGIN 
:NEW.STAFF_ID := BEFORE_INSERTING.nextval; 
END; 
/

顺便说一句,这个代码工作正常,但是当你看到它是从1000

+0

使用序列有什么问题? –

+0

我必须从当前最大ID继续,但我从1000开始,而不是从当前最大值开始。 那么是否有任何代码可以获得当前的最大值并通过加1来继续计数?希望我的英语很清楚,对不起。 – CemAtes

+0

“*我如何获得当前的最大ID *” - 你不需要这个。无论如何,它在多用户环境下无法正常工作。序列中的差距是**不相关**绝对没有必要避免它们。 –

回答

2

开始也许你可以使用类似下面找到STAFF_ID的最大值,然后重新定义基于序列该值:

DECLARE 
    nMax_staff_id NUMBER; 
BEGIN 
    SELECT MAX(STAFF_ID) 
    INTO nMax_staff_id 
    FROM STAFF; 

    EXECUTE IMMEDIATE 'DROP SEQUENCE BEFORE_INSERTING'; 

    EXECUTE IMMEDIATE 'CREATE SEQUENCE BEFORE_INSERTING START WITH ' || 
        nMax_staff_id + 1 || ' INCREMENT BY 1'; 
END; 

您只需要运行一次以上,只是为了获得序列重置。之后,触发器将使用该序列来获取每个STAFF_ID值。请注意,还有其他方法可以重新定义序列的值,但在此我们将执行可能可能工作的最简单事情,即删除序列,然后使用新的初始值重新创建序列。

祝你好运。

1

,以便找到最大STAFF_ID你需要以下选择:

select max(STAFF_ID) from STAFF; 

一旦你有,你可以最高STAFF_ID根据需要重新创建序列。

在任何情况下,你可以增加一个序列,像这样:

ALTER SEQUENCE seq_name INCREMENT BY 1; 

我希望帮助!

请不要犹豫,留下任何进一步的澄清评论。

泰德。

1

使用序列保证STAFF_ID的唯一性,但不保证在分配STAFF_ID时没有间隙。您最终可能会得到STAFF_ID,例如100,101,103,106 ..

首先,在系统未运行时获取最大值(STAFF_ID)。类似于

select max(staff_id) from staff; 

然后,创建从最大staff_id开始的序列。喜欢的东西

create sequence staff_sequence start with <max_id> + 1 increment by 1 nocache; 

“NOCACHE”有差距的分配

后staff_id的机会,使用创建从seuqnece得到NEXTVAL

注意以下触发最小化: - 为nextval调用一个序列后,该调度的数字将不能返回到序号 - 如果oracle数据库已关闭,则任何缓存的序列值都将丢失

如果您的要求不是在staff_ids之间存在差距,则可能不会使用序列。