如何将列从PRIMARY KEY更改为IDENTITY for Derby

时间:2011-09-03 19:31:39

标签: sql derby

用于创建表的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 ...

非常感谢您的帮助!

3 个答案:

答案 0 :(得分:5)

documentation这似乎不可能。您可以更改类型长度(甚至不是类型本身),默认值,可为空性和下一个生成的值,但即使是最后一个选项也需要将列定义为IDENTITYthread from 2009表示您甚至无法添加IDENTITY列。测试证实了这一点至今仍然存在。

所以似乎只有一个解决方案:你必须更换表。像这样:

  1. 使用包含所需列的占位符名称创建一个新表
  2. 从原始表中复制任何数据
  3. 删除原始表格
  4. 重命名新表
  5. 这真是一个不幸的解决方案,因为如果您已经有其他表引用表的id列,那将意味着进一步的工作。

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

答案 1 :(得分:2)

has been fixed开始,在Derby 10.12.1.1 release中查看此问题。现在命令如:

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

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

答案 2 :(得分:1)

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