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

23 浏览
0 Comments

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

我有一个包含169个表的数据库\n我需要在每个表中添加这个列:\n

wid integer not null primary key

\n我尝试了这个(感谢https://stackoverflow.com/users/27535/gbn提供的解决方案):\n

SELECT 
  'ALTER TABLE ' + T.name + ' ADD foo int NULL'
FROM
  sys.tables AS T
WHERE
  T.is_ms_shipped = 0

\n但这在PostgreSQL上不起作用。\n它只在tsql上起作用。\n如何一次在每个表中添加这个列?

0
0 Comments

在PostgreSQL中,有时我们需要在数据库的每个表中添加一个新的列。为了实现这个目标,我们需要首先检查该列是否已经存在,然后在每个表中执行相应的ALTER TABLE语句来添加新的列。

以下是一个在每个表中添加新列的解决方案的示例代码,该代码已在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;
$$;

这段代码使用了一个循环来遍历数据库中的每个表,并在每个表中执行ALTER TABLE语句来添加新的列。在执行ALTER TABLE语句之前,代码会先检查该列是否已经存在。如果遇到了duplicate_column异常,代码会继续执行下一次循环,以便在其他表中添加列。

通过这种方式,我们可以方便地在每个表中添加新的列,而无需手动逐个执行ALTER TABLE语句。这样可以节省大量的时间和工作量,特别适用于需要在大量表中添加相同列的情况。

需要注意的是,这里的示例代码是基于PostgreSQL V10的,可能在其他版本的PostgreSQL中略有不同。如果使用的是其他版本的PostgreSQL,请确保代码的兼容性和正确性。

总结起来,通过以上的代码示例,我们可以轻松地在PostgreSQL数据库的每个表中添加新的列,提高了工作效率和准确性。

0
0 Comments

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

问题的原因是需要在数据库的每个表中添加一个名为"foo"的列,该列的类型是SERIAL,它是一个整数类型,并且该列是每个表的主键。解决方法是使用PL/pgSQL语言编写一个函数,该函数通过循环遍历数据库中的每个表,并使用ALTER TABLE语句添加新的列。

以下是解决问题的代码:

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;

代码中,首先声明了一个记录类型的变量row和一个字符串类型的变量cmd。然后,使用SELECT语句从pg_tables系统表中获取所有位于'schema'模式下的表的schemaname和tablename,使用循环遍历这些表。在循环中,使用format函数构建一个ALTER TABLE语句,将schemaname和tablename替换为当前表的模式和名称,并将cmd变量设置为构建的语句。然后,使用RAISE NOTICE语句打印出ALTER TABLE语句的内容。最后,通过EXECUTE语句执行ALTER TABLE语句,将新的列添加到表中。

如果你想要查看命令而不执行它们,可以取消注释EXECUTE语句之前的--号。如果你不满意结果,建议在一个事务中运行代码,以便可以回滚更改。

需要注意的是,使用SERIAL类型创建的列实际上是一个整数类型的列,但它还会创建一个由表拥有的序列,并将列的默认值设置为该序列的下一个值。

0
0 Comments

在PostgreSQL中,有一个问题是如何在数据库的每个表中添加一个新列。下面是解决该问题的代码和讨论。

首先,我们可以使用以下代码来向每个表添加新列:

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;
$$;

这段代码使用了一个循环,遍历了数据库中的每个表,并使用ALTER TABLE语句向每个表添加了新的列。

接下来,我们可以使用以下查询来测试是否成功地向所有表中添加了新列:

select 
     table_name,COLUMN_NAME
 from 
     INFORMATION_SCHEMA.COLUMNS 
 where 
   COLUMN_NAME='foo' -- column name here

通过查询INFORMATION_SCHEMA.COLUMNS表,我们可以看到新的列是否已经添加到每个表中。

在讨论中,有一些人提到了代码中的一些问题。其中一个人指出循环条件错误,另一个人则认为在其环境中该方法不适用。然而,也有人表示在他们的环境中成功地测试了这段代码。

,以上代码提供了一种向数据库的每个表中添加新列的方法。通过循环遍历每个表,并使用ALTER TABLE语句来添加新列,我们可以轻松地向数据库中的所有表添加新列。然后,使用查询来验证是否成功地添加了新列。虽然有一些讨论中提到的问题,但这种方法在大多数情况下应该是有效的。

0