Генерация первичного ключа Oracle 11 - PullRequest
0 голосов
/ 07 мая 2019

У нас есть таблица БД 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 не должно быть в операторе вставки.Это решит проблему.Кто-то, однако, говорит, что триггер может вызвать проблемы с производительностью.

Какое будет альтернативное решение?

Обновление:

В таблице есть отметка времени.Мы решаем иметь составной ключ идентификатора и метку времени для решения проблемы.Мне странно иметь дело с этим вопросом.

1 Ответ

0 голосов
/ 13 мая 2019

Полагаю, вам следует проверить, не передается ли значение больше, поскольку, как вы упомянули, приложение выполняет команду FOO_SQU.NEXTVAL, и чтобы не увеличивать ее последовательность в два раза, вы можете добавить if.

create or replace TRIGGER FOO_TRIGGER 
BEFORE INSERT ON foo FOR EACH ROW
BEGIN

  IF :NEW.ID is NULL THEN
     SELECT FOO_SQU.NEXTVAL
     INTO :NEW.ID
     FROM DUAL;
  END IF;

END;

Как уже упоминалось в комментариях, в Oracle вряд ли возникнут проблемы с потерей последовательности, возможно, приложение использовало неверный код.

Вы используете последовательность в качестве параметра при вставке или используете триггер, я думаю, вы не увидите никакой практической разницы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...