我是PostgreSQL的新手。当我将数据库从MySql迁移到PostgreSQL时,我在执行查询(未找到列)时遇到了问题。
即,在MySQL中,我在表名提供者上有一个列名是authType。在迁移数据库时,由于混合大小写字母,我的PostgreSQL中的列创建类似于“AuthType”(带引号)。当我运行像“从提供程序中选择authType”这样的选择查询时,它在MySQL中工作正常,但它不适用于PostgreSQL。
如何在执行查询之前避免引用该列。我还有100个表,每个表都有一些带有大小写字母的列。
答案 0 :(得分:5)
创建表格后,您可以将所有列批量转换为小写。此函数执行此操作,将模式名称作为输入:
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;
因此,在公共架构中使用此表provider("AuthType" int)
,运行select lower_case_columns('public')
后,这将成为
provider(authtype int)
可以使用select authType from provider
以及select authtype from provider
或任何不带双引号的案例变体进行查询。
答案 1 :(得分:4)
创建表时,您需要避免混合情况(或双引号)。如果它在表的定义中全部小写,则可以使用未加引号的混合大小写标识符,Postgres将在内部静默地小写它们。