我创建了一个 Oracle 序列和触发器,以在插入新记录时自动增加表上的主键列。这是我的代码:
CREATE TABLE MOBILE_APP
(
"MOBILE_APP_ID" NUMBER(9, 0) PRIMARY KEY,
"NAME" VARCHAR2(60) NOT NULL,
"DESCRIPTION" VARCHAR2(200),
CONSTRAINT name_unique UNIQUE (name)
);
CREATE SEQUENCE MOBILE_APP_ID_SEQ
MINVALUE 1
MAXVALUE 999999999
INCREMENT BY 1
START WITH 1
NOCACHE
ORDER
NOCYCLE;
CREATE TRIGGER MOBILE_APP_BR_I
BEFORE INSERT ON MOBILE_APP
FOR EACH ROW
BEGIN
SELECT MOBILE_APP_ID_SEQ.NEXTVAL INTO :NEW.MOBILE_APP_ID FROM dual;
END;
由于我的触发器是“插入之前”,它将在记录实际插入表之前执行。但我没想到我的触发器即使在插入期间违反唯一约束的情况下也会执行。假设表、序列和触发器都是新的,我尝试执行以下语句两次。
INSERT INTO MOBILE_APP (name, description) VALUES ('Name', 'Desc');
第一次执行将成功完成,在插入记录的“mobile_app_id”字段中自动填充值 1。正如预期的那样,第二次执行将因与“名称”字段相关的唯一约束违规而出错。但是,如果我在不违反唯一约束的情况下插入另一条记录,则值 3 会自动填充到插入记录的“mobile_app_id”字段中——这意味着在尝试插入期间由于违反唯一约束而失败,值序列仍然从 1 增加到 2。如何防止这种情况发生?我发现了这个其他帖子,但不幸的是它没有解决问题。任何帮助将不胜感激!