重命名 PostgreSQL 中的多个列
Renaming multiple columns in PostgreSQL
我的 table 有一堆格式如下的列:
_settingA
_settingB
_settingB
我想重命名它们只是为了添加一个前缀,如下所示:
_1_settingA
_1_settingB
_1_settingC
我有很多超过三列要用这种方式重命名。如果我只有三个,我会一个一个地手动完成。
最快/最有效的方法是什么?
你不能那样做。
除了RENAME和SET SCHEMA之外的所有操作都可以组合成一个包含多个更改的列表以并行应用。
最有效的方法是使用 ActiveRecord。
没有单一的命令方法。显然,您可以自己为 RENAME
输入多个命令,但让我引入一些改进:) 正如我在 this answer
中所说的
...for all such bulk-admin-operations you could use PostgreSQL system tables to generate queries for you instead of writing them by hand
在你的情况下它将是:
SELECT
'ALTER TABLE ' || tab_name || ' RENAME COLUMN '
|| quote_ident(column_name) || ' TO '
|| quote_ident( '_1' || column_name) || ';'
FROM (
SELECT
quote_ident(table_schema) || '.' || quote_ident(table_name) as tab_name,
column_name
FROM information_schema.columns
WHERE
table_schema = 'schema_name'
AND table_name = 'table_name'
AND column_name LIKE '\_%'
) sub;
这将为您提供一组字符串,这些字符串是 SQL 命令,例如:
ALTER TABLE schema_name.table_name RENAME COLUMN "_settingA" TO "_1_settingA";
ALTER TABLE schema_name.table_name RENAME COLUMN "_settingB" TO "_1_settingB";
...
如果您的 table 在 public
模式中,则无需在 WHERE
子句中使用 table_schema
。 还记得使用函数 quote_ident()
——阅读我的原始答案以获得更多解释。
编辑:
我更改了我的查询,现在它适用于名称以下划线 _
开头的所有列。因为下划线在 SQL 模式匹配中是特殊字符,我们必须将它转义(使用 \
)才能准确找到它。
像这样简单的事情就可以了。
SELECT FORMAT(
'ALTER TABLE %I.%I.%I RENAME %I TO %I;',
table_catalog,
table_schema,
table_name,
column_name,
'_PREFIX_' + column_name
)
FROM information_schema.columns
WHERE table_name = 'foo';
%I
会做 quote_ident
,这要好得多。如果你在 PSQL 中,你可以 运行 它与 \gexec
您可以使用以下功能:
(我用它来为超过 50 列的表添加前缀)
首先创建函数:
CREATE OR REPLACE FUNCTION rename_cols( schema_name_ text,table_name_ text, prefix varchar(4))
RETURNS bool AS
$BODY$
DECLARE
rec_selection record;
BEGIN
FOR rec_selection IN (
SELECT column_name FROM information_schema.columns WHERE table_schema = schema_name_ AND table_name = table_name_) LOOP
EXECUTE 'ALTER TABLE '||schema_name_||'.'||table_name_||' RENAME COLUMN "'|| rec_selection.column_name ||'" TO "'||prefix|| rec_selection.column_name ||'" ;';
END LOOP;
RETURN True;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
然后执行函数:
SELECT rename_cols('public','test','d');
希望有用,
我的 table 有一堆格式如下的列:
_settingA
_settingB
_settingB
我想重命名它们只是为了添加一个前缀,如下所示:
_1_settingA
_1_settingB
_1_settingC
我有很多超过三列要用这种方式重命名。如果我只有三个,我会一个一个地手动完成。
最快/最有效的方法是什么?
你不能那样做。
除了RENAME和SET SCHEMA之外的所有操作都可以组合成一个包含多个更改的列表以并行应用。
最有效的方法是使用 ActiveRecord。
没有单一的命令方法。显然,您可以自己为 RENAME
输入多个命令,但让我引入一些改进:) 正如我在 this answer
...for all such bulk-admin-operations you could use PostgreSQL system tables to generate queries for you instead of writing them by hand
在你的情况下它将是:
SELECT
'ALTER TABLE ' || tab_name || ' RENAME COLUMN '
|| quote_ident(column_name) || ' TO '
|| quote_ident( '_1' || column_name) || ';'
FROM (
SELECT
quote_ident(table_schema) || '.' || quote_ident(table_name) as tab_name,
column_name
FROM information_schema.columns
WHERE
table_schema = 'schema_name'
AND table_name = 'table_name'
AND column_name LIKE '\_%'
) sub;
这将为您提供一组字符串,这些字符串是 SQL 命令,例如:
ALTER TABLE schema_name.table_name RENAME COLUMN "_settingA" TO "_1_settingA";
ALTER TABLE schema_name.table_name RENAME COLUMN "_settingB" TO "_1_settingB";
...
如果您的 table 在 public
模式中,则无需在 WHERE
子句中使用 table_schema
。 还记得使用函数 quote_ident()
——阅读我的原始答案以获得更多解释。
编辑:
我更改了我的查询,现在它适用于名称以下划线 _
开头的所有列。因为下划线在 SQL 模式匹配中是特殊字符,我们必须将它转义(使用 \
)才能准确找到它。
像这样简单的事情就可以了。
SELECT FORMAT(
'ALTER TABLE %I.%I.%I RENAME %I TO %I;',
table_catalog,
table_schema,
table_name,
column_name,
'_PREFIX_' + column_name
)
FROM information_schema.columns
WHERE table_name = 'foo';
%I
会做 quote_ident
,这要好得多。如果你在 PSQL 中,你可以 运行 它与 \gexec
您可以使用以下功能: (我用它来为超过 50 列的表添加前缀)
首先创建函数:
CREATE OR REPLACE FUNCTION rename_cols( schema_name_ text,table_name_ text, prefix varchar(4))
RETURNS bool AS
$BODY$
DECLARE
rec_selection record;
BEGIN
FOR rec_selection IN (
SELECT column_name FROM information_schema.columns WHERE table_schema = schema_name_ AND table_name = table_name_) LOOP
EXECUTE 'ALTER TABLE '||schema_name_||'.'||table_name_||' RENAME COLUMN "'|| rec_selection.column_name ||'" TO "'||prefix|| rec_selection.column_name ||'" ;';
END LOOP;
RETURN True;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
然后执行函数:
SELECT rename_cols('public','test','d');
希望有用,