我刚接触PostgreSQL。当我将数据库从MySql迁移到PostgreSQL时,在执行查询(找不到列)时遇到了问题。

即,在MySQL中,我在表名称提供程序上具有的一列名称是authType。在数据库迁移时,由于大小写字母混合,在我的PostgreSQL中像“AuthType”(带引号)一样创建了此列。当我运行诸如“从提供者中选择authType”之类的选择查询时,它在MySQL中工作正常,但在PostgreSQL上却不工作。

在执行查询之前,如何避免对列使用引号。我还有100多个表,每个表都有一些混合大小写字母的列。

最佳答案

创建表后,可以将所有列批量转换为小写。该函数使用模式名称作为输入来执行此操作:

CREATE FUNCTION lower_case_columns(_schemaname text) RETURNS void AS
$$
DECLARE
  colname text;
  tablename text;
  sql text;
BEGIN
  FOR tablename,colname in select table_name,column_name FROM information_schema.columns
    WHERE table_schema=_schemaname AND column_name<>lower(column_name)
  LOOP
    sql:=format('ALTER TABLE %I.%I RENAME COLUMN %I TO %I',
       _schemaname,
       tablename,
       colname,
       lower(colname));
    raise notice '%', sql;
    execute sql;
  END LOOP;
END;
$$ LANGUAGE plpgsql;

因此,在公共(public)模式下使用此表provider("AuthType" int)时,在运行select lower_case_columns('public')后,它将变为
 provider(authtype int)

并且可以使用select authType from providerselect authtype from provider或任何不带双引号的case变体查询。

10-08 05:03