我有在MySQL中工作的项目。

它有数百个查询,还有一些表名和列名都是大写的,这就是为什么

查询像

 select  * from TEST


没有引号将无法在pgSQL中工作。

那么,谁能给我一种不会在所有查询中进行更改的解决方案?

最佳答案

关于表名最简单的事情是:创建表时,表中不带引号

create table "TEST"     -- BAD
create table TEST       -- good
create table test       -- even better


同样,您的查询中表名或列名不应包含任何引号。

select "TEST"."COLUMN" from "TEST"    -- BAD
select TEST.COLUMN from TEST          -- good
select test.column from test          -- even better


最后两个版本与PostgreSQL相同,因为未加引号的标识符会自动折叠为小写。

只需确保到处都没有引号(查询和DDL中的引号)并完成该部分即可。

编辑:使用引号语法创建表并且它们在psql外壳中显示为大写或大小写混合时,则可以重命名表:

alter table "TEST" rename to TEST;    -- or "to test" - doesn't matter


这是生成命令的快速方法,您必须自己将其复制并粘贴到psql shell中:

select
    'alter table "' || table_schema || '"."' || table_name || '" to ' ||
    lower(table_name)
from information_schema.tables
where table_type = 'BASE TABLE' and table_name != lower(table_name);

              ?column?
-------------------------------------
 alter table "public"."TEST" to test


基本原理您必须对所有查询使用一种标准:要么全部不加引号(然后,实际表名必须折叠成小写),要么全部都带引号(然后,实际表名必须在字面上匹配)。极度疼痛是不可能混合的。

通常没有人大惊小怪并将引号添加到手写查询中,因此,我的期望是,解决此标准的工作量要比其他方法少。这意味着您必须根据PostgreSQL最佳实践来重命名表。

关于mysql - 从MySQL迁移到psql,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11754359/

10-11 06:30
查看更多