我有在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/