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

11

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

Мне не удалось найти команду для преобразования всехcolumns к регистронезависимости таким же образом. Как этого достичь?

РЕДАКТИРОВАТЬ: Видимо, приведенный выше код преобразует только имена таблиц в нижний регистр. Мне известно, что этот код ALTER TABLE & quot; YourTableName & quot; ИЗМЕНИТЬ НА YourTableName; преобразует в регистр без учета имени таблицы. Есть ли способ сделать аналогичную функцию по массе для имен столбцов?

Нет, postgres просто преобразует имена в нижний регистр, если вы не указали их в кавычках во время создания и изменения таблиц и запросов. El Yobo
Это также делает их нечувствительными к регистру, не так ли, потому что нет никаких кавычек вокруг имен столбцов, когда они переименованы. CSharpened
В случае, если это имеет значение для вас, это не учитывает регистр; это преобразует их все в нижний регистр. El Yobo
Фактические имена столбцов сами. У меня проблемы с доступом к ним через псевдоним. CSharpened
Вы хотите сделать колонкуnames без учета регистра или столбцаvalues при сравнении данных? a_horse_with_no_name

Ваш Ответ

4   ответа
0

который делает именно это.

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

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

How do I adopt the PostgreSQL naming convention in legacy database?
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> выполнять фактические заявления.

Идентификатор относится к именам таблиц и столбцов. И все сброс, как вид, последовательность, схема и т. Д. Имена.
Возможно, мы читаем другой вопрос, или он был изменен изменениями? Я вижу следующее выше: «Мне не удалось найти команду для преобразования всех столбцов в регистр без учета регистра таким же образом. Как этого достичь? ».
@ElYobo ОП не указывает, в чем проблема. В комментарии он намекает, что у него проблемы с использованием псевдонима. Так что, похоже, он пытается решить проблему, которая не та, с которой он сталкивается.
Это хорошее объяснение причин проблемы, но на самом деле не решение вопроса ФП.
Красиво и удобно. Благодарю. Однако во 2-м операторе вы должны опустить & quot; AND t.relname! = Lower (t.relname) & quot; потому что он опускает таблицы, которые уже все строчные.
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
Если вам нужно сделать это для последовательностей:select 'ALTER SEQUENCE '||'"'||sequence_name||'"'||' RENAME TO ' || lower(sequence_name)||';' from information_schema.sequences where sequence_schema = 'public' and lower(sequence_name) != sequence_name;
Нет, это для всех из них. Я обновил макет, чтобы сделать его более понятным, и изменил запрос, чтобы сделать его более умным (чтобы он не пытался переименовывать столбцы уже в нижнем регистре).
Разве это не только для одного столбца? CSharpened
Если вам нужно сделать это для ограничений:select 'ALTER TABLE '||'"'||table_name||'" RENAME CONSTRAINT ' || '"'||constraint_name||'" TO ' || lower(constraint_name)||';' from information_schema.table_constraints where table_schema = 'public' and lower(constraint_name) != constraint_name;
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 пункт.

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