PostgreSQL能否将数据库对象默认名称改为大写?
首先明确:PostgreSQL 无法通过修改配置实现默认将未加引号的标识符转换为大写。这一行为是内核解析器的硬编码逻辑,没有可调整的配置参数,完全遵循SQL标准中“未加引号的标识符不区分大小写,默认转换为小写”的规定。
为什么现有方案无法解决问题
你提到的ALTER TABLE修改对象名称的方案,只能修改已存在对象的名称,但无法改变PostgreSQL对未加引号标识符的解析规则:当执行SELECT * FROM MY_TABLE;时,系统仍会自动将MY_TABLE转换为小写my_table,因此找不到大写的"MY_TABLE"对象,报错relation "my_table" does not exist是必然的。
适配多数据库迁移/兼容场景的替代方案
针对你的迁移需求,有几种可行的替代思路:
预处理DDL语句,批量添加双引号
编写脚本或借助迁移工具,自动将所有未加引号的表名、列名转换为大写并包裹双引号。例如:
原语句:CREATE TABLE My_Table (A int);转换后执行:
CREATE TABLE "MY_TABLE" ("A" int);这样创建的对象就是大写命名,后续查询时只要保持用带双引号的大写标识符,就能正常访问。
创建小写视图映射大写对象
若已经存在大量大写命名的对象,可批量创建小写名称的视图指向对应的大写对象:CREATE VIEW my_table AS SELECT * FROM "MY_TABLE";这样执行未加引号的
SELECT * FROM MY_TABLE;时,系统转成my_table后会匹配到视图,间接访问大写表。但这种方式需要维护视图与原对象的结构同步,适合小范围场景。客户端/ORM层统一处理标识符
在应用的数据库客户端或ORM框架中配置标识符策略,自动将所有未加引号的表名、列名转换为大写并添加双引号。比如在Java的Hibernate中,可通过自定义命名策略实现这一转换,从源头解决SQL语句的大小写兼容问题。
内容的提问来源于stack exchange,提问作者lsdrs

