我已经看到可以使用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;将转换为对表名称不区分大小写。有没有办法在列名称的质量上执行类似的功能?
答案 0 :(得分:16)
默认情况下,所有标识符都不区分大小写,内部PostgreSQL以小写形式存储它们。如果您需要:
在您的标识符中,您应该在标识符周围使用双引号("
)。
请检查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查询来执行此操作。
' '
转换为'_'
有关详细信息,请参阅
答案 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。请注意,您无需在此处更改任何内容。
现在将结果导出到文本文件。
使用 Excel、记事本或您选择的任何文本编辑器打开 .csv 文件。复制除第一行(“ddlsql”)以外的所有行并将它们粘贴到 PgAdmin 中的新查询中。确保删除重复的文本引用。运行它并完成。