2015-01-06 22 views
0

在HSLQDB v 2.3.1中有定义UDT的create type子句。但似乎没有alter type子句,就文档而言(如果我尝试此操作,db返回unexpected token错误)。如何更改HSQLDB中的UDT?

是否可以在HSQLDB中修改/删除UDT?如果例如我最初创建的最佳做法是什么

create type CURRENCY_ID as char(3) 

因为我决定要使用ISO代码。但后来我实际上决定将代码存储为整数。在我的数据库中修改架构的最佳方法是什么? (这是一个综合示例,显然我不会在这种情况下使用整数)。

我想我可能会做

alter table inventory alter column ccy set data type int 
drop type CURRENCY_ID 
create type CURRENCY_ID as int 
alter table inventory alter column ccy set data type CURRENCY_ID 

,但有没有更好的方式来做到这一点?

+1

看来你实际上是在寻找一个“域”而不是一个新的数据类型:http://hsqldb.org/doc/2.0/guide/databaseobjects-chapt.html#dbc_domain_creation(btw:没有版本3.2.1,你的意思是2.3.1?) –

+0

是的,我想你是对的。任何想法如何影响性能?即如果我'创建类型CURRENCY_ID为int' vs'创建域CURRENCY_ID为int',没有任何额外的约束?我发现的另一个问题是,在涉及处理UDT时,JDBC规范在DOMAIN上不像TYPE那样清晰......例如,请参阅我过去提出的这个:http://sourceforge.net/p/ HSQLDB /臭虫/ 1352 / – Luciano

回答

0

尝试过各种方法后,我最终编写了一个脚本来直接编辑数据库的*.script文件。这是一个带有SQL命令的纯文本文件,以编程方式重新创建数据库。详细:

  1. 开放分贝,shutdown compact
  2. 编辑所述脚本文件:更换类型定义,例如create type XXX as intcreate type XXX as char(4)
  3. 对于每个表,替换insert into table XXX values (i,...)insert into table XXX values('str',...)。这是通过将旧(int)值映射到新(char)值的脚本完成的。
  4. 在我的特殊情况下,我正在更换主键,因此我必须从create table声明中删除identity指令,并且还必须删除具有alter table XXX alter column YYY restart sequence 123的行。
  5. 保存并关闭脚本文件,打开数据库,shutdown compact

这不是很大,但它的工作。优点:

  • 重新定义UDT的能力。
  • 以编程方式映射表值的功能。
  • 方法是通用的,可用于除UDT之外的其他模式更改。

缺点

  • 没有检查的模式是一致的(尽管它扔了错误,如果它不能读剧本)。
  • 将文件作为文本文件读取时存在危险。例如如果我有一个带有换行符的VARCHAR列,该怎么办?当我解析脚本文件并写回时,这需要被转义。
  • 不确定这是否适用于非内存DB。即那些在关机时不仅具有*.script文件的文件。
  • 对于大型数据库可能效率不高。我的数据库很小〜1MB。