寻找一种从Postgres中的多个表中删除多个列的方法

时间:2015-09-11 14:20:06

标签: postgresql

我有大约300个表,每个表在处理过程中添加了7列。每个表中这些列的名称相同。我们不再使用这些列,必须将其删除。有没有办法从我在批处理中指定的所有表中删除这些列?

2 个答案:

答案 0 :(得分:1)

你可以采取霰弹枪方法并执行以下操作:

CREATE FUNCTION alter_tables() RETURNS VOID AS $$
DECLARE
    table_record RECORD;
BEGIN
    FOR table_record IN SELECT table_name::TEXT FROM information_schema.tables WHERE table_type = 'BASE TABLE' AND table_schema = '<SCHEMA_NAME>' LOOP
        EXECUTE 'ALTER TABLE ' || table_record.table_name || ' DROP COLUMN IF EXISTS <COLUMN_NAME> CASCADE;';
    END LOOP;
END;
$$ LANGUAGE plpgsql;

SELECT alter_tables();
DROP FUNCTION alter_tables();

视情况更换<SCHEMA_NAME><COLUMN_NAME>

如果您需要对要更改的确切表集更具选择性,这显然会起作用。

答案 1 :(得分:0)

为此任务使用information_schema个视图集。您特别感兴趣的是columns视图。示例代码可能如下:

-- test DDL
CREATE TABLE table1 (col1 INTEGER,col2 INTEGER);
CREATE TABLE table2 (col1 INTEGER,col2 INTEGER);

-- possible function definition
CREATE OR REPLACE FUNCTION delete_columns(schema_to_process TEXT,column_list TEXT[]) RETURNS VOID AS
$BODY$
DECLARE
  column_record RECORD;
BEGIN
  FOR column_record IN
    SELECT * FROM information_schema.columns AS cinfo
    WHERE cinfo.table_schema = $1
    AND cinfo.column_name = ANY($2)
  LOOP
    EXECUTE 'ALTER TABLE ' || $1 || '.' || column_record.table_name || ' DROP COLUMN IF EXISTS ' || column_record.column_name || ' CASCADE;';
  END LOOP;
END;
$BODY$
LANGUAGE 'plpgsql';

-- sample run
SELECT delete_columns('public',ARRAY['col2']);