【问题标题】:PostgreSQL: How to add a column in every table of a database?PostgreSQL:如何在数据库的每个表中添加一列?
【发布时间】:2014-11-17 13:19:36
【问题描述】:

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

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

【问题讨论】:

  • 但是我想一次在 169 个表中添加一列。
  • 所以您想在数据库中的每个 tables 中添加列 wid ???
  • 是的,先生。我不想手动做这个:)
  • SQL中的字符串连接运算符是||而不是+
  • @Kumar 您提供的链接与 OP 问题无关。

标签: sql database postgresql


【解决方案1】:
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

测试您的所有 tables 是否被新的 column 更改
select 
     table_name,COLUMN_NAME
 from 
     INFORMATION_SCHEMA.COLUMNS 
 where 
   COLUMN_NAME='foo' -- <whatever your column name here>

【讨论】:

  • 绝对错误的 Winged。在这种情况下,您的逻辑不正确。
  • @ajay 说出你的理由
  • 如前所述,您使用了错误的循环条件。
  • @a_horse_with_no_name 我仍然认为它不会在这种情况下起作用。
  • @GabrielLidenor 查看我的最新编辑
【解决方案2】:

试试这个(将“公共”更改为您正在执行此操作的任何架构)

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 - 列类型将为整数,但还会创建表拥有的序列并将列值默认为该序列的下一个值。

【讨论】:

    【解决方案3】:

    我们可能需要检查列是否已经存在

    在 PostgreSQL V10 上测试

    do $$
    declare selectrow record;
    begin
    for selectrow in
        select 'ALTER TABLE '|| T.mytable || ' ADD COLUMN x_is_exported boolean DEFAULT FALSE' as script 
       from (select tablename as mytable from  pg_tables where schemaname  ='public') t
    loop
        begin
            execute selectrow.script;
            EXCEPTION WHEN duplicate_column THEN CONTINUE;
        END;
    end loop;
    end;
    $$;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-14
      • 1970-01-01
      • 2017-09-09
      • 1970-01-01
      相关资源
      最近更新 更多