У нас есть таблица БД foo,
ID NUMBER(10,0) No 1
, где ID является первичным ключом.
Кто-то написал оператор вставки
INSERT INTO foo (ID, ...) VALUES (foo_squ.NEXTVAL, ...)
, где foo_squ - этосквенс.И это определяется следующим образом:
CREATE SEQUENCE "FOO_SQU" MINVALUE 0 MAXVALUE 9999999999 INCREMENT BY 1 START WITH 3331 NOCACHE NOORDER CYCLE ;
Оператор вставки вызывает дублированную ошибку первичного ключа.
Чтобы выяснить проблему, я запускаю
select foo_squ.nextval from dual;
и я получаю 339. И я запускаю
select id from foo where id >= 338;
, и я получаю 338.
Я создал триггер для решения проблемы.
create or replace TRIGGER FOO_TRIGGER
BEFORE INSERT ON foo FOR EACH ROW
BEGIN
SELECT FOO_SQU.NEXTVAL
INTO :NEW.ID
FROM DUAL;
END;
С помощью триггера,поле ID не должно быть в операторе вставки.Это решит проблему.Кто-то, однако, говорит, что триггер может вызвать проблемы с производительностью.
Какое будет альтернативное решение?
Обновление:
В таблице есть отметка времени.Мы решаем иметь составной ключ идентификатора и метку времени для решения проблемы.Мне странно иметь дело с этим вопросом.