11

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

Я видел, что можно конвертировать всеtablesчтобы нечувствительные к регистру имена, используя следующие команды в psql: \o /tmp/go_to_lower select 'ALTER TABLE '||'"'||tablename||'"'||' RENAME TO ' || lower(tablename)||';' from pg_tables where ...

В случае, если это имеет значение для вас, это не учитывает регистр; это преобразует их все в нижний регистр.

от El Yobo

Вы хотите сделать колонку<b>names</b> без учета регистра или столбца<b>values</b> при сравнении данных?

от a_horse_with_no_name

Фактические имена столбцов сами. У меня проблемы с доступом к ним через псевдоним.

от CSharpened

Это также делает их нечувствительными к регистру, не так ли, потому что нет никаких кавычек вокруг имен столбцов, когда они переименованы.

от CSharpened

Нет, postgres просто преобразует имена в нижний регистр, если вы не указали их в кавычках во время создания и изменения таблиц и запросов.

от El Yobo

4 ответа

0

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

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

16

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

  • case sensitive
  • non-ASCII characters
  • special characters

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

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

EDIT: После вашего разъяснения вы можете использовать:

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> выполнять фактические заявления.

0

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

  1. Converts all identifiers to lower case
  2. Converts spaces ' ' to '_'
  3. Does this for all schema, table, and column names

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

14

Таким же образом, как и в оригинале, вы сможете сделать следующее. Это переименовывает все столбцы, которые еще не находятся в нижнем регистре, путем извлечения их из 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

Похожие вопросы