[英]Renaming multiple columns in PostgreSQL
我的表有一堆以下格式的列:
_settingA
_settingB
_settingB
我想簡單地重命名它們以添加前綴,如下所示:
_1_settingA
_1_settingB
_1_settingC
我有很多比三列更用這種方式來命名。 如果我只有三個,我會一個一個地手動完成。
實現這一目標的最快/最有效的方法是什么?
沒有單一的命令方法。 顯然,您可以自己為RENAME
鍵入多個命令,但讓我進行一些改進:) 正如我在此答案中所說
...對於所有此類批量管理操作,您可以使用 PostgreSQL 系統表為您生成查詢,而不是手動編寫它們
在您的情況下,它將是:
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";
...
如果您的表在public
架構中,則table_schema
在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');
希望有用,
你不能那樣做。
除了RENAME和SET SCHEMA之外的所有操作都可以組合成多個更改的列表以並行應用。
最有效的方法是使用 ActiveRecord。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.