![](/img/trans.png)
[英]How to create an Oracle sequence starting with max value from a table?
[英]Oracle - Set the sequence value to max indentity value of the table within trigger
我需要从表中获取最大缩进值并将序列设置为该值。
为此,我试图从该触发器内的表(在其上触发了当前触发器的表)中读取最大同一性值,并将序列设置为该值,但是我要在读取表时发生变异错误。 我正在使用Oracle 11g。
所以我的问题是有什么办法可以在此触发器内将序列值设置为表的最大标识值? 请指教。
这是我的触发器;
create or replace
TRIGGER StringTextTrg BEFORE INSERT ON StringText
FOR EACH ROW
DECLARE
v_newVal NUMBER(12) := 0;
v_incval NUMBER(12) := 0;
BEGIN
IF INSERTING AND :new.STxtID IS NULL THEN
SELECT StringText_STxtID_SEQ.NEXTVAL INTO v_newVal FROM DUAL;
-- If this is the first time this table have been inserted into (sequence == 1)
IF v_newVal = 1 THEN
--get the max indentity value from the table
SELECT NVL(max(STxtID),0) INTO v_newVal FROM StringText;
v_newVal := v_newVal + 1;
--set the sequence to that value
LOOP
EXIT WHEN v_incval>=v_newVal;
SELECT StringText_STxtID_SEQ.nextval INTO v_incval FROM dual;
END LOOP;
END IF;
-- assign the value from the sequence to emulate the identity column
:new.STxtID := v_newVal;
END IF;
END;
以下是我的答案,对此我强烈反对:
CREATE OR REPLACE TRIGGER StringTextTrg
BEFORE INSERT
ON StringText
FOR EACH ROW
DECLARE
v_newVal NUMBER (12) := 0;
v_incval NUMBER (12) := 0;
BEGIN
IF INSERTING AND :new.STxtID IS NULL THEN
SELECT StringText_STxtID_SEQ.NEXTVAL INTO v_newVal FROM DUAL;
-- If this is the first time this table have been inserted into (sequence == 1)
IF v_newVal = 1 THEN
--get the max indentity value from the table
SELECT NVL (MAX (STxtID), 0) INTO v_newVal FROM StringText;
v_newVal := v_newVal + 1;
--set the sequence to that value
EXECUTE IMMEDIATE ('DROP SEQUENCE StringText_STxtID_SEQ');
EXECUTE IMMEDIATE ('CREATE SEQUENCE StringText_STxtID_SEQ START WITH '||to_char(v_newVal));
END IF;
-- assign the value from the sequence to emulate the identity column
:new.STxtID := v_newVal;
END IF;
END;
/
序列是数据库对象。 您无法重置它们,必须删除并重新创建它们。 因此,您必须(ab)为此任务使用动态SQL。
这不是创建自动生成的连续整数主键列值的最佳实践。 此外,请考虑禁止手动输入此列,因为这些输入肯定会按照您尝试维护的顺序造成混乱。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.