PostgreSQL:如何在数据库的每个表中添加一列?

时间:2014-09-23 10:57:10

标签: sql database postgresql

我有一个包含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。

如何一次在每个表中添加此列?

3 个答案:

答案 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;
    }
}