用于创建表的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 ...
非常感谢您的帮助!
答案 0 :(得分:5)
看documentation这似乎不可能。您可以更改类型长度(甚至不是类型本身),默认值,可为空性和下一个生成的值,但即使是最后一个选项也需要将列定义为IDENTITY
。 thread from 2009表示您甚至无法添加IDENTITY
列。测试证实了这一点至今仍然存在。
所以似乎只有一个解决方案:你必须更换表。像这样:
这真是一个不幸的解决方案,因为如果您已经有其他表引用表的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旧桌子。