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

Gab*_*nor 2 sql database postgresql

我有一个包含169个表的数据库

我在每个表中都需要这个列:

wid integer not null primary key
Run Code Online (Sandbox Code Playgroud)

我尝试了这个(感谢/sf/users/1927481/解决方案):

SELECT 
  'ALTER TABLE ' + T.name + ' ADD foo int NULL'
FROM
  sys.tables AS T
WHERE
  T.is_ms_shipped = 0
Run Code Online (Sandbox Code Playgroud)

但它在PostgreSQL上不起作用.

它只适用于tsql.

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

Viv*_* S. 10

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;
$$;
Run Code Online (Sandbox Code Playgroud)

您可以使用以下选择测试是否所有表都使用新进行了更改

select 
     table_name,COLUMN_NAME
 from 
     INFORMATION_SCHEMA.COLUMNS 
 where 
   COLUMN_NAME='foo' -- <whatever your column name here>
Run Code Online (Sandbox Code Playgroud)


hbn*_*hbn 5

试试这个(将“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;
Run Code Online (Sandbox Code Playgroud)

如果您按原样运行,它将显示命令。取消注释 EXECUTE 行以实际执行更改。

我会在事务中运行,这样如果您对结果不满意,您可以回滚。

请注意,类型是SERIAL- 列类型将为整数,但还会创建表拥有的序列,并将列值默认为该序列的下一个值。