Postgresql:遍历每个表并检查列?

3

我正在尝试在 pgAdmin 中编写一个简单的 SQL 查询,以循环遍历数据库中的每个表,并在存在指定列名的情况下更改该列名。我从未编写过 SQL 代码,但在浏览了许多论坛后,设法想出以下代码:

DO
BEGIN
FOR i IN SELECT table_name FROM information_schema.tables
LOOP
   IF SELECT column_name FROM information_schema.columns WHERE table_name = 'i.table_name'
 THEN
   ALTER TABLE i.table_name RENAME COLUMN old_column_name TO new_column_name
END IF;
END LOOP;
3个回答

7
您可以完全跳过 information_schema.tables。 只需执行以下操作:
DO
$$
DECLARE
    rec record;
BEGIN
    FOR rec IN 
        SELECT table_schema, table_name, column_name
        FROM information_schema.columns 
        WHERE column_name = 'x'
    LOOP
        EXECUTE format('ALTER TABLE %I.%I RENAME COLUMN %I TO newname;',
            rec.table_schema, rec.table_name, rec.column_name);
    END LOOP;
END;
$$
LANGUAGE plpgsql;

请对'x'newname进行适当的替换。或者将其制作成一个函数,将它们作为参数传入,随意。


非常感谢。现在清晰多了。这节省了我大量的手动工作。 :) - user3688391

0

你的问题的正确答案已经在上面发布了。或者,如果你只是像我一样想从所有表中删除一列,那么可以这样做。

DO
$$
DECLARE
  rec record;
BEGIN
  FOR rec IN
  SELECT table_schema, table_name, column_name
  FROM information_schema.columns
  WHERE column_name = 'my_column_name_to_drop'
  LOOP
    EXECUTE format('ALTER TABLE %I.%I DROP %I;',
                   rec.table_schema, rec.table_name, rec.column_name);
  END LOOP;
END;
$$
LANGUAGE plpgsql;

其中my_column_name_to_drop是您要查找的实际列名。


0

看起来你不需要查询 tables,只需要查询旧列名的 columns 并获取它所在的表。

你需要使用 动态 SQL 来进行重命名操作。

参见 这里 如何循环遍历查询结果。当然,这需要在 PL/pgSQL 函数中完成。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接