如何将数据库中的所有列转换为不区分大小写

时间:2012-04-10 09:52:50

标签: postgresql

我已经看到可以使用psql中的以下命令将所有转换为不区分大小写的名称:

\o /tmp/go_to_lower
select 'ALTER TABLE '||'"'||tablename||'"'||' RENAME TO ' ||
lower(tablename)||';' from pg_tables where schemaname = 'public';
psql -U username database < /tmp/go_to_lower

我无法以同样的方式发布将所有转换为不区分大小写的命令。如何实现这一目标?

编辑:显然上面的代码只将表名转换为小写。我知道这段代码ALTER TABLE“YourTableName”RENAME TO YourTableName;将转换为对表名称不区分大小写。有没有办法在列名称的质量上执行类似的功能?

5 个答案:

答案 0 :(得分:16)

默认情况下,所有标识符都不区分大小写,内部PostgreSQL以小写形式存储它们。如果您需要:

  • 区分大小写
  • 非ASCII字符
  • 特殊字符

在您的标识符中,您应该在标识符周围使用双引号(")。

请检查PostgreSQL文档的this bit

编辑:在澄清之后,您可以使用:

SELECT 'ALTER TABLE '||quote_ident(t.relname)||' RENAME TO '||t.relname||';'
  FROM pg_class t, pg_namespace s
 WHERE s.oid = t.relnamespace AND s.nspname = 'public'
   AND t.relkind='r' AND t.relname != lower(t.relname)
 ORDER BY 1;

和列:

SELECT 'ALTER TABLE '||quote_ident(t.relname)||
       ' RENAME COLUMN '||quote_ident(a.attname)||
       ' TO '||a.attname||';'
  FROM pg_class t, pg_namespace s, pg_attribute a
 WHERE s.oid = t.relnamespace AND s.nspname = 'public'
   AND t.relkind='r'
   AND a.attrelid = t.oid AND NOT a.attisdropped AND a.attnum > 0
   AND a.attname != lower(a.attname)
 ORDER BY 1;

然后将输出复制粘贴到您的客户端。

如果您使用的是psql,则可以使用\t启用仅限行模式,\o <full_file_path>将输出保存到临时文件中,最后\i <full_file_path>执行实际的陈述。

答案 1 :(得分:14)

与原版相同,您应该能够执行以下操作。这将重命名所有尚未小写的列,方法是从information_schema中提取它们,为更改生成SQL,将其存储到文件中,然后再次执行SQL。

\t on
select 'ALTER TABLE '||'"'||table_name||'"'||' RENAME COLUMN '||'"'||column_name||'"'||' TO ' || lower(column_name)||';' 
from information_schema.columns 
where table_schema = 'public' and lower(column_name) != column_name
\g /tmp/go_to_lower
\i /tmp/go_to_lower

答案 2 :(得分:0)

do language plpgsql $$
declare
    r record;
begin
    for r in
        select relname, attname
        from pg_attribute a
        inner join pg_class c on a.attrelid = c.oid
        inner join pg_namespace n on c.relnamespace = n.oid
        where 
            n.nspname = 'public'
            and
            attname != lower(attname)
            and
            not attisdropped
    loop
        execute format('
            alter table %1$I rename column %2$I to %3$s
        ', r.relname, r.attname, lower(r.attname));
    end loop;
end;
$$;

在尝试之前发出begin;。检查它是否正确。然后才发出commit;。如果您使用的是命名空间,请将其替换为where子句。

答案 3 :(得分:0)

我在数据库管理员上创建了一个SQL查询来执行此操作。

  1. 将所有标识符转换为小写
  2. 将空格' '转换为'_'
  3. 这是否适用于所有架构,表和列名称
  4. 有关详细信息,请参阅

答案 4 :(得分:0)

让我为像我这样的初学者和那些不习惯像 psql 这样的命令行工具的人添加一个使用 PgAdmin 的分步指南:

在 PgAdmin 中执行以下查询:

SELECT  'ALTER TABLE ' || quote_ident(c.table_schema) || '.'
  || quote_ident(c.table_name) || ' RENAME "' || c.column_name || '" TO ' || quote_ident(lower(c.column_name)) || ';' As ddlsql
  FROM information_schema.columns As c
  WHERE c.table_schema NOT IN('information_schema', 'pg_catalog') 
      AND c.column_name <> lower(c.column_name) 
  ORDER BY c.table_schema, c.table_name, c.column_name;

*来源:https://www.postgresonline.com/article_pfriendly/141.html。请注意,您无需在此处更改任何内容。

现在将结果导出到文本文件。

enter image description here

使用 Excel、记事本或您选择的任何文本编辑器打开 .csv 文件。复制除第一行(“ddlsql”)以外的所有行并将它们粘贴到 PgAdmin 中的新查询中。确保删除重复的文本引用。运行它并完成。