Как правильно установить последовательность GENERATED BY DEFAULT AS IDENTITY после вставки ручных идентификаторов?

У меня есть таблица с последовательностью первичных ключей, использующая более новую функцию 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

@a_horse_with_no_name Было полезное решение для PostgreSQL, но теперь оно мне нужно для Oracle. Я изменил тег соответственно.

Manngo 12.04.2023 13:48
как сбросить столбец Identity в Oracle
Ponder Stibbons 12.04.2023 14:04

1. generated always во время создания. 2. alter table modify id generated ... как в связанном вопросе

astentx 12.04.2023 14:29

Отвечает ли это на ваш вопрос? как сбросить столбец Identity в Oracle

The Impaler 12.04.2023 14:56

@PonderStibbons Принятый метод ответа 2, кажется, выполняет свою работу. Не тот же вопрос, но ответ сделал работу. Спасибо.

Manngo 13.04.2023 09:25
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
5
122
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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.

Другие вопросы по теме