如何定义一个在插入新人时自动提供id的触发器?

时间:2017-09-04 20:28:59

标签: sql oracle plsql database-trigger

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

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

config/webpackDevServer.config.js

顺便说一下,这段代码工作得很好但是你看到它从1000开始。

3 个答案:

答案 0 :(得分: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 :(得分:1)

为了找到最大STAFF_ID,您需要在下面选择:

select max(STAFF_ID) from STAFF;

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

在任何情况下,您都可以按如下方式递增序列:

ALTER SEQUENCE seq_name INCREMENT BY 1;

我希望有所帮助!

请不要犹豫,对任何进一步的澄清发表评论。

泰德。

答案 2 :(得分:1)

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

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

这样的东西
select max(staff_id) from staff;

然后,创建从max staff_id开始的序列。像

这样的东西
create sequence staff_sequence start with <max_id> + 1 increment by 1 nocache;

&#34; NOCACHE&#34;最大限度地减少了分配的staff_id中存在间隙的可能性

之后,使用您创建的触发器从seuqnece获取nextval

请注意以下事项: - 一旦为nextval调用了一个序列,该调度的数字就不能返回到sequnece - 如果oracle数据库关闭,任何缓存的序列值都将丢失

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