У меня есть таблица с последовательностью первичных ключей, использующая более новую функцию GENERATED BY DEFAULT AS IDENTITY:
CREATE TABLE test (
id INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
data VARCHAR
);
Затем я даю таблице несколько значений для начала, переопределяя последовательность:
INSERT INTO test(id,data) VALUES (3,'something');
INSERT INTO test(id,data) VALUES (6,'something else');
Теперь, если я добавлю еще несколько значений, пусть последовательность сделает свое дело:
INSERT INTO test(data) VALUES ('whatever');
INSERT INTO test(data) VALUES ('stuff');
INSERT INTO test(data) VALUES ('etc');
… Я получаю сообщение об ошибке:
ORA-00001: уникальное ограничение (FIDDLE_CEYTNFUWNIDRFXSPTDWJ.SYS_C0054804) нарушено
ОК, я понимаю ошибку: видимо, последовательность начинается сначала и начинает перекрываться с существующими значениями.
Как правильно установить последовательность после начальной INSERT?
У меня есть рабочий пример по адресу: https://dbfiddle.uk/MtPocwBq
1. generated always во время создания. 2. alter table modify id generated ... как в связанном вопросе
Отвечает ли это на ваш вопрос? как сбросить столбец Identity в Oracle
@PonderStibbons Принятый метод ответа 2, кажется, выполняет свою работу. Не тот же вопрос, но ответ сделал работу. Спасибо.


Сбросьте сгенерированную последовательность идентификаторов, используя:
alter table test modify (id generated as identity (start with 7));
См. модифицированную скрипку .
Краткий ответ:
ALTER TABLE test MODIFY ID GENERATED BY DEFAULT AS IDENTITY (START WITH LIMIT VALUE);
Описание в документации Oracle :
НАЧАТЬ С ПРЕДЕЛЬНОГО ЗНАЧЕНИЯ, специфичного для identity_options, можно использоваться только с ALTER TABLE MODIFY. Если вы укажете START WITH LIMIT ЗНАЧЕНИЕ, то Oracle Database блокирует таблицу и находит максимальное значение. значение столбца идентификатора в таблице (для возрастающих последовательностей) или минимальное значение столбца идентификации (для убывающей последовательности) и присваивает значение как наивысшая отметка генератора последовательности. Следующее значение возвращаемый генератором последовательности, будет высшей точкой + УВЕЛИЧЕНИЕ НА целое число для возрастающих последовательностей или верхняя отметка - УВЕЛИЧЕНИЕ НА целое число для убывающих последовательностей.
И ваш модифицированный dbfiddle.
@a_horse_with_no_name Было полезное решение для PostgreSQL, но теперь оно мне нужно для Oracle. Я изменил тег соответственно.