Как преобразовать все столбцы в моей базе данных в регистр без учета регистра

Я видел, что можно преобразовать все таблицы в нечувствительные к регистру имена, используя следующие команды в psql:

\o /tmp/go_to_lower
select 'ALTER TABLE '||'"'||tablename||'"'||' RENAME TO ' ||
lower(tablename)||';' from pg_tables where schemaname = 'public';
psql -U username database < /tmp/go_to_lower

Мне не удалось откопать команду, чтобы преобразовать все столбцы в регистр без учета регистра таким же образом. Как это можно достичь?

EDIT: По-видимому, приведенный выше код преобразует имена таблиц в нижний регистр. Я знаю, что этот код ALTER TABLE "YourTableName" RENAME TO YourTableName; преобразует в регистр без учета регистра имя таблицы. Есть ли способ сделать подобную функцию по массе для имен столбцов?

Ответ 1

В то же время, что и оригинал, вы должны иметь возможность сделать следующее. Это переименовывает все столбцы, которые еще не указаны в нижнем регистре, извлекая их из information_schema, генерируя SQL для изменений, сохраняя их в файле, а затем выполняйте SQL снова.

\t on
select 'ALTER TABLE '||'"'||table_name||'"'||' RENAME COLUMN '||'"'||column_name||'"'||' TO ' || lower(column_name)||';' 
from information_schema.columns 
where table_schema = 'public' and lower(column_name) != column_name
\g /tmp/go_to_lower
\i /tmp/go_to_lower

Ответ 2

По умолчанию все ваши идентификаторы нечувствительны к регистру, а внутренне PostgreSQL хранит их в нижнем регистре. Если вам нужно:

  • чувствительный к регистру
  • символы, отличные от ASCII
  • специальные символы

внутри ваших идентификаторов, вы должны использовать двойные кавычки (") вокруг ваших идентификаторов.

Пожалуйста, проверьте этот бит документации PostgreSQL.

РЕДАКТИРОВАТЬ: После уточнения вы можете использовать:

SELECT 'ALTER TABLE '||quote_ident(t.relname)||' RENAME TO '||t.relname||';'
  FROM pg_class t, pg_namespace s
 WHERE s.oid = t.relnamespace AND s.nspname = 'public'
   AND t.relkind='r' AND t.relname != lower(t.relname)
 ORDER BY 1;

и для столбцов:

SELECT 'ALTER TABLE '||quote_ident(t.relname)||
       ' RENAME COLUMN '||quote_ident(a.attname)||
       ' TO '||a.attname||';'
  FROM pg_class t, pg_namespace s, pg_attribute a
 WHERE s.oid = t.relnamespace AND s.nspname = 'public'
   AND t.relkind='r'
   AND a.attrelid = t.oid AND NOT a.attisdropped AND a.attnum > 0
   AND a.attname != lower(a.attname)
 ORDER BY 1;

Затем скопируйте файл в свой клиент.

Если вы используете psql, вы можете использовать \t, чтобы включить режим только строк, \o <full_file_path>, чтобы сохранить вывод во временном файле и, наконец, \i <full_file_path> для выполнения действительных операторов.

Ответ 3

do language plpgsql $$
declare
    r record;
begin
    for r in
        select relname, attname
        from pg_attribute a
        inner join pg_class c on a.attrelid = c.oid
        inner join pg_namespace n on c.relnamespace = n.oid
        where 
            n.nspname = 'public'
            and
            attname != lower(attname)
            and
            not attisdropped
    loop
        execute format('
            alter table %1$I rename column %2$I to %3$s
        ', r.relname, r.attname, lower(r.attname));
    end loop;
end;
$$;

Задайте a begin;, прежде чем пытаться это сделать. Проверьте правильность. Только тогда выпустите a commit;. Если вы используете пространство имен, замените его в предложении where.

Ответ 4

Я создал SQL-запрос для администраторов баз данных, который делает именно это.

  • Преобразует все идентификаторы в нижний регистр
  • Преобразует пробелы ' ' в '_'
  • Это относится ко всем именам схем, таблиц и столбцов.

Для получения дополнительной информации см.