我有一个在MySQL工作的项目。
它有数百个查询,而且一些表名和列名都是大写的,这就是
的原因查询
select * from TEST
在没有引用的情况下无法在pgSQL中运行。
那么有人能给我一个不会在所有查询中做出改变的解决方案吗?
答案 0 :(得分:1)
关于表名的最简单的事情是:创建表,而没有任何引用,如
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
shell中显示为大写或大小写时,您可以重命名表:
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最佳实践重命名表。
答案 1 :(得分:0)
没有一个。 MySQL使用了一些与SQL不兼容的语法扩展(PostgreSQL也是如此),并且在查询中存在一些很难自动转换的差异(GROUP BY,DISTINCT)。
TL; DR;你别无选择,只能手动修复查询并检查它们的行为方式完全相同(不是给定的)。