【问题标题】:Column to be modified is not an identity column要修改的列不是标识列
【发布时间】:2016-04-30 14:19:28
【问题描述】:

我已经创建了一个包含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

【问题讨论】:

  • stackoverflow.com/questions/1049210/… 希望对您有所帮助。
  • @NitinGarg 这个问题是关于 Oracle 的,但你链接到的问题是关于 MS SQL Server,所以我想它不会帮助 OP 解决他们的问题。

标签: oracle identity-column


【解决方案1】:

您收到此错误仅仅是因为目前不支持将现有列修改为 IDENTITY 列。

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

【讨论】:

  • 可能是什么原因?现在有什么解决办法?
  • 解决方案是添加一个新列,然后删除现有列(确保您也处理数据)。我想不出可能的原因 - 在发布此功能时必须做出某种实施决定。将现有的 NOT NULL NUMBER 列修改为 IDENTITY 意味着 Oracle 需要计算列中的最大数字,然后从那里开始自动递增。以最佳方式实现这一点可能存在某种困难?但只有相关人员才能回答真正的原因:)
  • 如何将现有表的数据复制到新表中?我认为只复制单列值是不可能的。那么如何将表的数据复制到新的?
  • CREATE TABLE AS new_table AS SELECT * FROM old_table;但是,如果您只想将现有列修改为 IDENTITY 列,只需在现有表中添加一个新列,然后删除现有列。如果有的话,你必须注意引用约束。
  • BTW 更新新列,你只需执行 UPDATE your_Table SET new_column = old_column;
【解决方案2】:

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

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

【讨论】:

  • 你能解释一下吗?为什么是 number_new?
  • 对不起,我的错误,ALTER TABLE 学生添加(S_ROLL_NEW NUMBER(3) 始终作为身份生成);
  • 你的意思是我需要新的专栏?那么我该如何复制数据呢?
  • @UnKnown UPDATE MYTABLE SET NEW_ID = OLD_ID;
【解决方案3】:

如果您不想创建新列的替代解决方案:

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;

【讨论】:

    猜你喜欢
    • 2016-02-18
    • 1970-01-01
    • 1970-01-01
    • 2016-12-05
    • 2016-01-03
    • 1970-01-01
    • 1970-01-01
    • 2017-07-04
    • 1970-01-01
    相关资源
    最近更新 更多