如何在HSQLDB中更改UDT?

时间:2015-01-06 16:52:26

标签: hsqldb

在HSLQDB v 2.3.1中,有一个create type子句用于定义UDT。但是就文档而言似乎没有alter type子句(如果我尝试这个,db会返回unexpected token错误。)

是否可以在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 个答案:

答案 0 :(得分:0)

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

  1. open db,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. 在我的特定情况下,我正在更改主键,因此我不得不从identity语句中删除create table指令,而且我还必须删除一个{{1}的行}}。
  5. 保存并关闭脚本文件,打开db,alter table XXX alter column YYY restart sequence 123
  6. 这不是很好,但它确实奏效了。优点:

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

    缺点

    • 不检查架构是否一致(尽管如果它无法读取脚本,它会引发错误。)
    • 将文件作为文本文件读取时危险。例如如果我有一个包含换行符的VARCHAR列怎么办?当我解析脚本文件并将其写回时,需要对其进行转义。
    • 不确定这是否适用于非内存数据库。即那些在关机时不会有shutdown compact文件的人。
    • 大型数据库可能效率不高。我的数据库很小~1MB。