Массовое переименование столбцов postgresql - PullRequest
1 голос
/ 08 декабря 2011

Возможно ли сделать массовое переименование всех столбцов определенного типа в postgresql. У меня есть ряд таблиц со столбцами типа геометрии (только 1 на таблицу) с такими именами, как "the_geom", "geom", "SP_GEOMETRY" и т. Д., Все они имеют разные имена из-за использования разных инструментов импорта.

Я бы хотел переименовать их в "the_geom" или "geom".

Ответы [ 2 ]

4 голосов
/ 08 декабря 2011

Запустите этот запрос, чтобы сгенерировать все необходимые операторы DDL:

SELECT 'ALTER TABLE ' || quote_ident(n.nspname) || '.' || quote_ident(c.relname)
    || ' RENAME column ' || quote_ident(a.attname) || ' TO geom;'
FROM   pg_catalog.pg_attribute a
JOIN   pg_catalog.pg_class c ON c.oid = a.attrelid
JOIN   pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE  a.attnum >= 1
AND    a.atttypid = 'geometry'::regtype::oid
AND    a.attname <> 'geom'
AND    NOT a.attisdropped
AND    n.nspname !~~ 'pg_%'  -- exclude catalog & temp tables, to be sure
-- AND    n.nspname = 'myschema'  -- target specific schema only?
1 голос
/ 08 декабря 2011

Запрос к системному каталогу и генерация команд - это обычно самый простой подход.Как то так:

select
   'alter table ' || quote_ident(nspname) || '.' || quote_ident(relname)
      || ' rename column ' || quote_ident(attname)
      || ' to ' || quote_ident('xxx')
from pg_attribute
join pg_class on pg_class.oid = pg_attribute.attrelid
join pg_namespace on pg_namespace.oid = pg_class.relnamespace
where atttypid = 'geometry'::regtype and (attname ~* 'geom')
      and not attisdropped and attnum > 0 and pg_class.oid >= 16384
...