Столбец, который нужно изменить, не является столбцом идентификаторов

Я создал таблицу со столбцом S_ROLL NUMBER(3) NOT NULL Теперь я хочу сделать этот столбец идентификатором. Я использовал эту команду

alter table students
modify
(
S_ROLL NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY
);

Тогда я получаю эту ошибку.

S_ROLL NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY
*
ERROR at line 4:
ORA-30673: column to be modified is not an identity column

person Asif Mushtaq    schedule 24.01.2016    source источник
comment
stackoverflow.com/questions/1049210 / Надеюсь, это вам поможет.   -  person Nitin Garg    schedule 24.01.2016
comment
@NitinGarg Этот вопрос касается Oracle, но вопрос, на который вы ссылаетесь, касается MS SQL Server, поэтому я думаю, что это не поможет OP решить их проблему.   -  person Frank Schmitt    schedule 24.01.2016


Ответы (3)


Вы получаете эту ошибку просто потому, что изменение существующего столбца как столбца IDENTITY в настоящее время не поддерживается.

Решение состоит в том, чтобы добавить новый столбец, а затем удалить существующий (убедившись, что вы также позаботились о данных).

person Incognito    schedule 24.01.2016
comment
какая может быть причина? и какое решение сейчас? - person Asif Mushtaq; 24.01.2016
comment
Решение состоит в том, чтобы добавить новый столбец, а затем удалить существующий (конечно, убедитесь, что вы также позаботились о данных). Я не могу придумать возможную причину этого - должно быть было принято какое-то решение о реализации при выпуске этой функции. Изменение существующего столбца NOT NULL NUMBER на IDENTITY означало бы, что Oracle необходимо вычислить наибольшее число в столбце, а затем начать автоматическое увеличение оттуда. Вероятно, какие-то трудности в реализации этого оптимальным образом? Но только причастные люди могут ответить на настоящую причину :) - person Incognito; 24.01.2016
comment
Как я могу скопировать данные существующей таблицы в новую? Я думаю, что копирование только одного значения столбца может быть невозможным. тогда как скопировать данные таблицы в новую? - person Asif Mushtaq; 24.01.2016
comment
CREATE TABLE AS new_table AS SELECT * FROM old_table; Но если вы просто хотите изменить существующий столбец на столбец IDENTITY, просто добавьте новый столбец в существующую таблицу, а затем удалите существующий столбец. Вам придется позаботиться о ссылочных ограничениях, если таковые имеются. - person Incognito; 24.01.2016
comment
Кстати, чтобы обновить новый столбец, вы просто выполняете UPDATE your_Table SET new_column = old_column; - person Incognito; 24.01.2016
comment
извините, я вернулся, чтобы спросить, должен ли я использовать ограничение PRIMARY KEY, когда я уже использовал IDENTITY для COLUMN? - person Asif Mushtaq; 24.01.2016

Поскольку изменение существующего столбца для идентификации столбца не поддерживается. Таким образом, вы можете использовать приведенный ниже запрос, чтобы добавить новый столбец.

ALTER TABLE students ADD (S_ROLL_NEW NUMBER(3) GENERATED ALWAYS AS IDENTITY);
person Shariar Imtiaz    schedule 24.01.2016
comment
Можете ли вы объяснить это, пожалуйста? почему номер_новый? - person Asif Mushtaq; 24.01.2016
comment
извините за мою ошибку, ALTER TABLE студенты ДОБАВЛЯЮТ (S_ROLL_NEW NUMBER (3) ВСЕГДА СОЗДАЕТСЯ КАК ИДЕНТИЧНОСТЬ); - person Shariar Imtiaz; 24.01.2016
comment
Вы имеете в виду, что мне нужна новая колонка? тогда как я могу скопировать данные? - person Asif Mushtaq; 24.01.2016
comment
@UnKnown UPDATE MYTABLE SET NEW_ID = OLD_ID; - person GabrielBB; 20.03.2018

Альтернативное решение, если вы не хотите создавать новый столбец:

CREATE SEQUENCE s_roll_seq
     START WITH 1 -- here last id + 1
   INCREMENT BY 1;

ALTER TABLE students
    MODIFY S_ROLL NUMBER DEFAULT s_roll_seq.NEXTVAL;
person Dmitry Klishev    schedule 25.01.2021