我已经看到可以使用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以小写形式存储它们.如果您需要:
在您的标识符中,您应该"在标识符周围使用双引号().
请检查该位 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>执行实际语句.
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)