我有一个在 MySQL 中工作的项目。
它有数百个查询,还有一些表名和列名是大写的,这就是为什么
查询喜欢
select * from TEST
没有引号就不能在 pgSQL 中工作。
那么任何人都可以给我一个不会改变所有查询的解决方案吗?
我有一个在 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 使用了一些与 SQL 不兼容的语法扩展(PostgreSQL 也是如此),并且查询中存在一些非常难以自动转换的主要差异(GROUP BY、DISTINCT)。
TL;博士; 您别无选择,只能手动修复查询并检查它们的行为方式完全相同(不是给定的)。