Я создал последовательность 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');
Первое выполнение завершится успешно, автоматически подставится значение 1 в поле «mobile_app_id» для вставленной записи. Как и ожидалось, второе выполнение приведет к ошибке с нарушением уникального ограничения относительно поля «имя». Но если я затем вставляю другую запись, не нарушая уникального ограничения, значение 3 автоматически подставляется в поле «mobile_app_id» для вставленной записи - это означает, что во время попытки вставки, которая не удалась из-за нарушения уникального ограничения, значение последовательность все еще увеличивается с 1 до 2. Как я могу предотвратить это? Я нашел этот другой пост, но, к сожалению, в нем нет решения проблемы. Любая помощь будет оценена!