РЕДАКТИРОВАТЬ: Учитывая то, что я знал в то время, я был прав, но, как оказалось, я не прав. В комментарии и соответствующей скрипте @ mickle sh показано, как это можно сделать с помощью ALTER TABLE MODIFY...
. Я попросил его опубликовать ответ, чтобы его можно было принять - пока я оставляю этот ответ здесь, чтобы другие могли по крайней мере перейти по ссылке на его dbfiddle . Но на самом деле - это неверно.
Извините, но вы не можете этого сделать.
У меня был действительно хороший ответ, подготовленный о том, как получить имя последовательности, для которой система создает столбец GENERATED ALWAYS AS IDENTITY
, и как преобразовать это значение LONG в строку символов, и как сбросить начальное значение последовательности - все это хорошо, и он сделал действительно хороший db <> fiddle - и затем, когда я все это завернул, я сделал последний проход - и получил
ORA-32793: cannot alter a system-generated sequence
Так что - Oracle не позволит вам изменить последовательность, которую он генерирует для столбца GENERATED ALWAYS AS IDENTITY
. Я думаю, это означает, что вы застряли и вам придется смириться с тем фактом, что эти цифры не могут быть сброшены, чтобы начать с одного. Другие ваши варианты:
Удалить и заново создать таблицу, что также потребует от вас воссоздания любых связанных триггеров и перекомпиляции любых процедур / функций / пакетов, которые используют эту таблицу, и, возможно, другие вещи, о которых я не думал; или
Не используйте GENERATE ALWAYS AS IDENTITY
, создайте свою собственную последовательность, используйте триггер, чтобы установить столбец идентификаторов из своей последовательности, и затем вы сможете использовать следующую процедуру для сброса вашей последовательности:
CREATE OR REPLACE FUNCTION RESET_SEQUENCE(pinSequence IN VARCHAR2,
pinStart_value IN NUMBER DEFAULT 1,
pinIncrement IN NUMBER DEFAULT 1)
RETURN NUMBER
AS
nVal NUMBER;
BEGIN
-- Get the next value from the sequence
EXECUTE IMMEDIATE 'SELECT ' || pinSequence || '.NEXTVAL ' ||
' FROM DUAL'
INTO nVal;
-- Change the sequence so it decrements or increments to the desired
-- start value the next time NEXTVAL is invoked.
EXECUTE IMMEDIATE 'ALTER SEQUENCE ' || pinSequence ||
' INCREMENT BY ' || (nVal - (pinStart_value - pinIncrement)) * -1 ||
' MINVALUE 0';
-- Decrement/increment the sequence to the desired start value
EXECUTE IMMEDIATE 'SELECT ' || pinSequence || '.NEXTVAL ' ||
' FROM DUAL'
INTO nVal;
-- Reset the sequence so it uses the desired "increment-by"
EXECUTE IMMEDIATE 'ALTER SEQUENCE ' || pinSequence ||
' INCREMENT BY ' || pinIncrement ||
' MINVALUE 0';
RETURN 1;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('RESET_SEQUENCE : ' || SQLCODE || ' ' || SQLERRM);
RETURN 0;
END RESET_SEQUENCE;
/
А вот db <> скрипка , показывающая общий тест функции RESET_SEQUENCE
.
чел.