【问题标题】:How to change a column name in HSQLDB when the existing name is a reserved word?当现有名称是保留字时,如何更改 HSQLDB 中的列名?
【发布时间】:2015-07-06 22:52:21
【问题描述】:

我正在尝试将我们的数据库从 HSQLDB 1.7 升级到最新版本。不幸的是,有人将一列命名为“默认”。我似乎无法在 SQL 中重命名此列(这在 1.7 中,因为重命名必须在升级之前进行)。

我已尝试转义该列:

stmt.executeUpdate("ALTER TABLE table_name ALTER COLUMN \"DEFAULT\" RENAME TO new_name");

和各种变体(包括'\"和[])似乎没有任何效果,我总是得到以下内容

java.sql.SQLException: Column not found: DEFAULT in statement [ALTER TABLE table_name ALTER COLUMN "DEFAULT"]

我显然错过了什么?

【问题讨论】:

    标签: java sql hsqldb


    【解决方案1】:

    不幸的是,有人将列命名为“默认”

    问题似乎出在外壳上。双引号不仅可以“转义”您的姓名,而且还使它们区分大小写,这与大多数数据库中不区分大小写的非引号名称不同。所以重命名列时必须使用精确的大小写:

    ALTER TABLE table_name ALTER COLUMN "Default" RENAME TO new_name
    

    ...或使用 JDBC:

    stmt.executeUpdate("ALTER TABLE table_name ALTER COLUMN \"Default\" RENAME TO new_name");
    

    【讨论】:

    • 我真的希望这是答案,不幸的是它仍然不起作用:找不到列:语句中的默认值 [ALTER TABLE table_name ALTER COLUMN "Default"]
    • 好吧,没关系,刚刚发现数据库升级方法运行了两次,所以第一次成功,第二次明显失败。谢谢!
    • @JamesW:它发生在最好的 ;-)
    【解决方案2】:

    来自HSQLDB guide

    所有关键字,如果是双精度则可用于数据库对象 引用。

    所以尝试使用这个:

    ALTER TABLE "table_name" ALTER COLUMN "DEFAULT" RENAME TO "new_name"
    

    【讨论】:

    • 该列已经是双引号,它只是用 \ 转义,因为它在 java 字符串中。但是在表名周围添加双引号实际上似乎使事情变得更糟。
    【解决方案3】:

    尝试使用 反引号 (`)。
    这应该很好地转义默认字符串。

    ALTER TABLE `table_name` ALTER COLUMN `DEFAULT` RENAME TO `new_name`
    

    【讨论】:

    • 这就是你在 MySQL 而不是 HSQLDB 中引用名称的方式
    猜你喜欢
    • 2022-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多