需要修改的列不是标识列。

20

我已经创建了一个带有列 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

希望这可以帮到你:https://dev59.com/K3NA5IYBdhLWcg3wNrAy - Nitin Garg
@NitinGarg 这个问题是关于Oracle的,但你链接的问题是关于MS SQL Server的,所以我猜它不会帮助OP解决他们的问题。 - Frank Schmitt
3个回答

31

您之所以出现此错误,是因为当前不支持将现有列修改为身份列。

解决方法是添加一个新列,然后删除现有列(确保您也要处理数据)。


什么原因可能会导致这种情况?现在的解决方案是什么? - Asif Mushtaq
1
解决方案是添加一个新列,然后删除现有的列(当然要确保数据也得到了处理)。我无法想象出这样做可能的原因 - 在发布此功能时必须采取某种实现决策。将现有的NOT NULL NUMBER列修改为IDENTITY意味着Oracle需要计算该列中最高的数字,然后从那里开始自动递增。可能在以最佳方式实现此操作方面存在某些困难?但只有参与其中的人才能回答实际原因 :) - Incognito
1
我该如何将现有表格的数据复制到新表格中?我认为仅复制单个列值可能是不可能的。那么如何将表格数据复制到新表格中呢? - Asif Mushtaq
创建新表并将旧表中的所有数据复制到新表中:CREATE TABLE AS new_table AS SELECT * FROM old_table;但是,如果您只想将现有列修改为IDENTITY列,请向现有表添加一个新列,然后删除现有列。如果有任何引用约束,则需要注意处理。 - Incognito
1
顺便提一下,要更新新列,只需执行UPDATE your_Table SET new_column = old_column; - Incognito
抱歉我又回来问了,当我已经在列上使用了IDENTITY时,我应该使用PRIMARY KEY约束吗? - Asif Mushtaq

2

如果您不想创建新列,则可以选择另一种解决方案:

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;

0

由于不支持修改现有列以标识列,因此您可以使用以下查询添加新列。

ALTER TABLE students ADD (S_ROLL_NEW NUMBER(3) GENERATED ALWAYS AS IDENTITY);

请问您能解释一下吗?为什么要用number_new? - Asif Mushtaq
抱歉,我的错误。应该是 ALTER TABLE students ADD (S_ROLL_NEW NUMBER(3) GENERATED ALWAYS AS IDENTITY);。 - Shariar Imtiaz
你的意思是我需要新的列吗?那么我该如何复制数据呢? - Asif Mushtaq
@UnKnown 更新 MYTABLE SET NEW_ID = OLD_ID; - GabrielBB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接