重命名 PostgreSQL 中具有特定列名的所有表中的所有列?
Rename all columns from all tables with specific column name in PostgreSQL?
有没有一种方法可以将我的 PostgreSQL 数据库中所有模式中名为 'location' 的所有列名称重命名为 'location_name'?
我是 SQL 的新手,我知道有一个 ALTER TABLE 命令,但不知道是否可以以某种方式遍历所有表?
您可以使用
获取数据库中的所有 location
列
SELECT * FROM information_schema.columns WHERE column_name = 'location';
然后可能使用某种编程语言来执行所有重命名查询。几乎每个数据库管理系统中都有 information_schema
个表(尽管有时它们 called/structured 不同)。
我想你最接近的是运行宁这样的东西:
SELECT FORMAT(
'ALTER TABLE %I.%I.%I RENAME COLUMN %I TO %I;',
catalog_name,
schema_name,
table_name,
column_name,
'location_name'
)
FROM information_schema.columns
WHERE column_name = 'location';
如果你 运行 在 psql 中,你可以用 \gexec
跟随它,它应该可以工作。
如果您有超级用户权限,您可以在系统目录中一次性完成更改:
UPDATE pg_attribute
SET attname = 'location_name'
WHERE attname = 'location';
您需要动态 SQL 为此使用匿名 PL/pgSQL 块以自动方式执行此操作:
do
$$
declare
l_rec record;
begin
for l_rec in (select table_schema, table_name, column_name
from information_schema.columns
where table_schema = 'public'
and column_name = 'location') loop
execute format ('alter table %I.%I rename column %I to %I_name', l_rec.table_schema, l_rec.table_name, l_rec.column_name, l_rec.column_name);
end loop;
end;
$$
如果您有多个架构或您的表不在 public
架构中,请将条件 where table_schema = 'public'
替换为适当的限制。
有没有一种方法可以将我的 PostgreSQL 数据库中所有模式中名为 'location' 的所有列名称重命名为 'location_name'?
我是 SQL 的新手,我知道有一个 ALTER TABLE 命令,但不知道是否可以以某种方式遍历所有表?
您可以使用
获取数据库中的所有location
列
SELECT * FROM information_schema.columns WHERE column_name = 'location';
然后可能使用某种编程语言来执行所有重命名查询。几乎每个数据库管理系统中都有 information_schema
个表(尽管有时它们 called/structured 不同)。
我想你最接近的是运行宁这样的东西:
SELECT FORMAT(
'ALTER TABLE %I.%I.%I RENAME COLUMN %I TO %I;',
catalog_name,
schema_name,
table_name,
column_name,
'location_name'
)
FROM information_schema.columns
WHERE column_name = 'location';
如果你 运行 在 psql 中,你可以用 \gexec
跟随它,它应该可以工作。
如果您有超级用户权限,您可以在系统目录中一次性完成更改:
UPDATE pg_attribute
SET attname = 'location_name'
WHERE attname = 'location';
您需要动态 SQL 为此使用匿名 PL/pgSQL 块以自动方式执行此操作:
do
$$
declare
l_rec record;
begin
for l_rec in (select table_schema, table_name, column_name
from information_schema.columns
where table_schema = 'public'
and column_name = 'location') loop
execute format ('alter table %I.%I rename column %I to %I_name', l_rec.table_schema, l_rec.table_name, l_rec.column_name, l_rec.column_name);
end loop;
end;
$$
如果您有多个架构或您的表不在 public
架构中,请将条件 where table_schema = 'public'
替换为适当的限制。