我有一个包含169个表的数据库
我需要在每个表格中使用此列:
wid integer not null primary key
我试过这个(感谢https://stackoverflow.com/users/27535/gbn解决方案):
SELECT
'ALTER TABLE ' + T.name + ' ADD foo int NULL'
FROM
sys.tables AS T
WHERE
T.is_ms_shipped = 0
但它并没有在PostgreSQL上运行。
它只适用于tsql。
如何一次在每个表中添加此列?
答案 0 :(得分:9)
do $$
declare
selectrow record;
begin
for selectrow in
select
'ALTER TABLE '|| T.mytable || ' ADD COLUMN foo integer NULL' as script
from
(
select tablename as mytable from pg_tables where schemaname ='public' --your schema name here
) t
loop
execute selectrow.script;
end loop;
end;
$$;
您可以使用以下选择
来测试是否所有表都使用新的列进行了更改select
table_name,COLUMN_NAME
from
INFORMATION_SCHEMA.COLUMNS
where
COLUMN_NAME='foo' -- <whatever your column name here>
答案 1 :(得分:3)
试试这个(将'public'改为你正在做的任何模式)
DO $$
DECLARE
row record;
cmd text;
BEGIN
FOR row IN SELECT schemaname, tablename FROM pg_tables WHERE schemaname = 'public' LOOP
cmd := format('ALTER TABLE %I.%I ADD COLUMN foo SERIAL PRIMARY KEY ', row.schemaname, row.tablename);
RAISE NOTICE '%', cmd;
-- EXECUTE cmd;
END LOOP;
END
$$ LANGUAGE plpgsql;
如果按原样运行,它会显示命令。取消注释EXECUTE行以实际执行更改。
我会在交易中运行,因此如果您对结果不满意,可以回滚。
请注意,类型为SERIAL
- 列类型将为整数,但也会创建表所拥有的序列,并将列值默认为该序列的下一个值。
答案 2 :(得分:0)
如果数据库太大,则系统尝试多次在表中添加同一列,因此我们需要检查列是否已存在。
在PostgreSQL V10上测试
@Configuration
public class BeanConfig {
private RestTemplate restTemplate;
public BeanConfig(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
@Bean
public SampleBean sampleBean(){
Resource resource = new UrlResource("");
// Some operation using resource and create the sampleBean bean
return sampleBean;
}
}