PostgreSQL:如何 运行 ALTER 查询作为 SQL SELECT 语句的结果返回
PostgreSQL : How to run ALTER queries returned as a result from SQL SELECT statement
我想向所有具有 table 名称模式的 table 添加一个新列 table_<>_详情.
我使用这个查询:
select 'alter table ' || table_name || ' ADD COLUMN CREATED TIMESTAMP;'
from information_schema.tables
where table_name like 'table_%_details';
生成如下所示的 DDL 查询:
alter table table_1_details ADD COLUMN CREATED TIMESTAMP;
alter table table_2_details ADD COLUMN CREATED TIMESTAMP;
alter table table_3_details ADD COLUMN CREATED TIMESTAMP;
alter table table_4_details ADD COLUMN CREATED TIMESTAMP;
alter table table_5_details ADD COLUMN CREATED TIMESTAMP;
alter table table_6_details ADD COLUMN CREATED TIMESTAMP;
alter table table_7_details ADD COLUMN CREATED TIMESTAMP;
我尝试使用以下脚本遍历这些记录:
do $$ declare c_query cursor for
select
'alter table ' || table_name || ' ADD COLUMN CREATED TIMESTAMP;'
from
information_schema.tables
where
table_name like 'table_%_details';
begin
for rec in c_query loop
execute rec;
end loop;
close c_query;
end $$
我已尝试微调此脚本但没有成功,出现以下错误:
SQL Error [42601]: ERROR: syntax error at or near ""alter table table_1_details ADD COLUMN CREATED TIMESTAMP;""
Where: PL/pgSQL function inline_code_block line 13 at EXECUTE statement
我的问题是如何修改此脚本以遍历所有这些结果并将 DDL 应用于数据库,请注意(我不想创建函数)。
如有任何想法,我们将不胜感激。
只需遍历 infomation_schema.tables
的结果集,然后将 EXECUTE
与串联的 ALTER TABLE
语句一起使用
DO $$
DECLARE
row record;
BEGIN
FOR row IN SELECT table_name FROM information_schema.tables
WHERE table_name LIKE 'table_%_details' LOOP
EXECUTE 'ALTER TABLE ' || row.table_name || ' ADD COLUMN CREATED TIMESTAMP;';
END LOOP;
END;
$$;
编辑:或者你可以使用FORMAT
连接你的字符串而不是使用||
,正如@a_horse_with_no_name[指出的那样=19=]
EXECUTE FORMAT('ALTER TABLE %I ADD COLUMN CREATED TIMESTAMP;',row.table_name);
勾选这个db<>fiddle
我想向所有具有 table 名称模式的 table 添加一个新列 table_<>_详情.
我使用这个查询:
select 'alter table ' || table_name || ' ADD COLUMN CREATED TIMESTAMP;'
from information_schema.tables
where table_name like 'table_%_details';
生成如下所示的 DDL 查询:
alter table table_1_details ADD COLUMN CREATED TIMESTAMP;
alter table table_2_details ADD COLUMN CREATED TIMESTAMP;
alter table table_3_details ADD COLUMN CREATED TIMESTAMP;
alter table table_4_details ADD COLUMN CREATED TIMESTAMP;
alter table table_5_details ADD COLUMN CREATED TIMESTAMP;
alter table table_6_details ADD COLUMN CREATED TIMESTAMP;
alter table table_7_details ADD COLUMN CREATED TIMESTAMP;
我尝试使用以下脚本遍历这些记录:
do $$ declare c_query cursor for
select
'alter table ' || table_name || ' ADD COLUMN CREATED TIMESTAMP;'
from
information_schema.tables
where
table_name like 'table_%_details';
begin
for rec in c_query loop
execute rec;
end loop;
close c_query;
end $$
我已尝试微调此脚本但没有成功,出现以下错误:
SQL Error [42601]: ERROR: syntax error at or near ""alter table table_1_details ADD COLUMN CREATED TIMESTAMP;""
Where: PL/pgSQL function inline_code_block line 13 at EXECUTE statement
我的问题是如何修改此脚本以遍历所有这些结果并将 DDL 应用于数据库,请注意(我不想创建函数)。
如有任何想法,我们将不胜感激。
只需遍历 infomation_schema.tables
的结果集,然后将 EXECUTE
与串联的 ALTER TABLE
语句一起使用
DO $$
DECLARE
row record;
BEGIN
FOR row IN SELECT table_name FROM information_schema.tables
WHERE table_name LIKE 'table_%_details' LOOP
EXECUTE 'ALTER TABLE ' || row.table_name || ' ADD COLUMN CREATED TIMESTAMP;';
END LOOP;
END;
$$;
编辑:或者你可以使用FORMAT
连接你的字符串而不是使用||
,正如@a_horse_with_no_name[指出的那样=19=]
EXECUTE FORMAT('ALTER TABLE %I ADD COLUMN CREATED TIMESTAMP;',row.table_name);
勾选这个db<>fiddle