Как преобразовать все столбцы в моей базе данных в регистр без учета регистра
Я видел, что можно преобразовать все таблицы в нечувствительные к регистру имена, используя следующие команды в 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-запрос для администраторов баз данных, который делает именно это.
- Преобразует все идентификаторы в нижний регистр
- Преобразует пробелы
' '
в '_'
- Это относится ко всем именам схем, таблиц и столбцов.
Для получения дополнительной информации см.