新しいレコードが挿入されたときにテーブルの主キー列を自動インクリメントする 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;
私のトリガーは「挿入前」であるため、レコードが実際にテーブルに挿入される前に実行されます。しかし、挿入中に一意の制約違反が発生した場合でも、トリガーが実行されるとは思っていませんでした。テーブル、シーケンス、およびトリガーがすべて新しく、次のステートメントを 2 回実行しようとするとします。
INSERT INTO MOBILE_APP (name, description) VALUES ('Name', 'Desc');
最初の実行は正常に完了し、挿入されたレコードの「mobile_app_id」フィールドに値 1 が自動入力されます。予想どおり、2 回目の実行では、「名前」フィールドに関連する一意の制約違反でエラーが発生します。しかし、一意の制約に違反せずに別のレコードを挿入すると、挿入されたレコードの「mobile_app_id」フィールドに値 3 が自動入力されます。つまり、一意の制約違反のために失敗した挿入の試行中に、シーケンスはまだ 1 から 2 にインクリメントされています。これを防ぐにはどうすればよいですか? この他の投稿を見つけましたが、残念ながら問題の解決策は含まれていません。どんな助けでも大歓迎です!