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

CSh*_*ned 12 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
Run Code Online (Sandbox Code Playgroud)

我一直无法发布一个命令,以同样的方式将所有转换为不区分大小写.怎么能实现这一目标?

编辑:显然上面的代码只将表名转换为小写.我知道这段代码ALTER TABLE"YourTableName"RENAME TO YourTableName; 将转换为对表名称不区分大小写.有没有办法对列名称进行大规模的类似功能?

vye*_*rov 16

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

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

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

请检查该位 PostgreSQL的文档.

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

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;
Run Code Online (Sandbox Code Playgroud)

和列:

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;
Run Code Online (Sandbox Code Playgroud)

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

如果您正在使用psql,则可以使用\t以启用仅行模式,\o <full_file_path>将输出保存到临时文件中,最后\i <full_file_path>执行实际语句.

  • @ElYobo OP没有说明问题所在.他暗示他在使用别名时遇到了问题.因此,他似乎正在尝试解决一个他正在经历的问题的解决方案. (2认同)

El *_*obo 15

与原版相同,您应该能够执行以下操作.这将重命名所有尚未为小写的列,方法是从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
Run Code Online (Sandbox Code Playgroud)

  • 如果您需要为约束执行此操作:`select 'ALTER TABLE '||'"'||table_name||'" RENAME CONSTRAINT ' || '"'||constraint_name||'" TO ' || 下(constraint_name)||';' 来自 information_schema.table_constraints where table_schema = 'public' and lower(constraint_name) != constraint_name;` (2认同)