从MySQL迁移到psql

时间:2012-08-01 07:20:21

标签: mysql postgresql

我有一个在MySQL工作的项目。

它有数百个查询,而且一些表名和列名都是大写的,这就是

的原因

查询

 select  * from TEST

在没有引用的情况下无法在pgSQL中运行。

那么有人能给我一个不会在所有查询中做出改变的解决方案吗?

2 个答案:

答案 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;你别无选择,只能手动修复查询并检查它们的行为方式完全相同(不是给定的)。