正如我在标题中所描述的那样,我想编写一个触发器,定义为除了ID之外的所有给定属性添加新的人员,我想触发生成并自动插入它。我怎么能这样做?
我在PL / SQL中编写了类似下面的代码,但它包含了序列,我无法找到如何使用序列获取我的员工的当前最大ID,所以,请你帮我,是否使用序列?
config/webpackDevServer.config.js
顺便说一下,这段代码工作得很好但是你看到它从1000开始。
答案 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之间存在间隙,则可能不会使用序列。