Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 要修改的列不是标识列_Oracle_Identity Column - Fatal编程技术网

Oracle 要修改的列不是标识列

Oracle 要修改的列不是标识列,oracle,identity-column,Oracle,Identity Column,我已经创建了一个列S\u ROLL NUMBER(3)不为空的表,现在我想将此列设为标识列。 我使用了这个命令 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

我已经创建了一个列
S\u ROLL NUMBER(3)不为空的表
,现在我想将此列设为标识列。 我使用了这个命令

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

出现此错误的原因很简单,因为现在不支持将现有列修改为标识列


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

因为不支持修改现有列以标识列。所以您可以使用下面的查询来添加新列

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

如果不想创建新列,可选择以下解决方案:

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;

希望这能对您有所帮助。@NitinGarg这个问题是关于Oracle的,但您链接的问题是关于MS SQL Server的,所以我想这对OP解决他们的问题没有帮助。您能解释一下吗?为什么数字是新的?对不起我的错误,改变表格学生添加(S_ROLL_新数字(3)总是作为身份生成);你是说我需要新专栏?那么如何复制数据?@UnKnown UPDATE MYTABLE SET NEW\u ID=OLD\u ID;原因可能是什么?现在的解决方案是什么?解决方案是添加一个新列,然后删除现有列(obv确保您也处理数据)。我想不出可能的原因——在发布此功能时,一定做出了某种实现决策。将现有的NOTNULL NUMBER列修改为IDENTITY意味着Oracle需要计算该列中的最高数字,然后从该列开始自动递增。在以最佳方式实现这一点时可能存在某种困难?但只有相关人员才能回答实际原因:)如何将现有表的数据复制到新表?我认为复制单个列的值是不可能的。那么,如何将表中的数据复制到新表中呢?将表创建为新表,如从旧表中选择*;但是,如果只是想将现有列修改为IDENTITY列,只需向现有表中添加一个新列,然后删除现有列。您必须注意引用约束,如果有的话。顺便说一句,要更新新列,只需执行更新您的_Table SET new_column=old_column;