【问题标题】:How to alter column from PRIMARY KEY to IDENTITY for Derby如何将列从 PRIMARY KEY 更改为 Derby 的 IDENTITY
【发布时间】:2011-09-03 19:31:39
【问题描述】:

建表的SQL是:

CREATE TABLE myTable(id INTEGER NOT NULL PRIMARY KEY, ...)

相反,我需要它:

CREATE TABLE myTable(id INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1), ...)

as described in the Derby documentation。所以我的问题是在初始创建语句之后我需要创建的 alter 语句是什么?换句话说:

CREATE TABLE myTable(id INTEGER NOT NULL PRIMARY KEY, ...)
ALTER TABLE myTable ...

非常感谢您的帮助!

【问题讨论】:

    标签: sql derby


    【解决方案1】:

    看着documentation 这似乎是不可能的。您可以更改类型长度(甚至不是类型本身)、默认值、可空性和下一个生成的值,但即使是最后一个选项也要求该列已经定义为 IDENTITYthread from 2009 表示您甚至不能添加 IDENTITY 列。直到今天,一项测试证实了这一点。

    所以似乎只有一个解决方案:您必须更换桌子。像这样的:

    1. 使用包含所需列的占位符名称创建一个新表
    2. 复制原始表中的所有数据
    3. 删除原始表
    4. 重命名新表

    这确实是一个不幸的解决方案,因为如果您已经有其他表引用了表的 id 列,因为这意味着需要进一步的工作。

    我尝试弄乱system tables,但它们似乎是只读的(并且有充分的理由)。

    【讨论】:

    • 您能否补充一下,解决方法是创建一个新表,复制内容,删除旧表,然后重命名临时表。我真的很喜欢你的解释,如果还包括解决方法就好了。
    • @Stephane:是的,我也整理了一下答案。
    • @Stephane:太好了。很高兴我能帮上忙。 :)
    【解决方案2】:

    10.12.1.1 release 开始,在 Derby has been fixed 中似乎存在此问题。现在的命令如:

    ALTER TABLE t ADD COLUMN x INT PRIMARY KEY GENERATED ALWAYS AS IDENTITY
    

    现在可以使用现有数据库,GENERATED BY DEFAULT 也是如此。看起来更改要求底层数据库至少为 10.11 格式。

    【讨论】:

      【解决方案3】:

      一种技术是:(a) 创建一个新表,其中定义了您想要的新列,以及所有其他列,(b) 运行 INSERT INTO ... SELECT ... 语句以复制现有表中的所有数据到新表,(c) RENAME TABLE 将旧表重命名为其他名称,(d) RENAME TABLE 将新表重命名为正确的表名,最后是 (e) DROP TABLE旧表。

      【讨论】:

        猜你喜欢
        • 2015-04-22
        • 1970-01-01
        • 2018-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多