17

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

同じ方法で、すべての列を大文字と小文字を区別しないように変換するコマンドを見つけることができませんでした。これはどのように達成できますか?

編集:どうやら上記のコードはテーブル名を小文字に変換するだけです。このコードALTERTABLE"YourTableName" RENAME TO YourTableName; テーブル名では大文字と小文字を区別しないように変換されます。列名の質量に対して同様の関数を実行する方法はありますか?

4

5 に答える 5

21

オリジナルと同じ線に沿って、次のことができるはずです。これにより、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
于 2012-04-10T11:58:23.667 に答える
19

デフォルトでは、すべての識別子は大文字と小文字を区別せず、内部的に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>実際のステートメントを実行できます。

于 2012-04-10T10:46:38.227 に答える
1

これを行うSQLクエリをデータベース管理者に作成しました。

  1. すべての識別子を小文字に変換します
  2. スペース' 'をに変換します'_'
  3. これは、すべてのスキーマ、テーブル、および列の名前に対して行われます

詳細については、を参照してください。

于 2018-03-27T19:32:23.630 に答える
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句に置き換えます。

于 2012-04-10T14:15:16.910 に答える
0

私のような初心者やpsqlのようなコマンドラインツールに慣れていない人のために、PgAdminを使用したステップバイステップガイドを追加しましょう。

PgAdminで次のクエリを実行します。

SELECT  'ALTER TABLE ' || quote_ident(c.table_schema) || '.'
  || quote_ident(c.table_name) || ' RENAME "' || c.column_name || '" TO ' || quote_ident(lower(c.column_name)) || ';' As ddlsql
  FROM information_schema.columns As c
  WHERE c.table_schema NOT IN('information_schema', 'pg_catalog') 
      AND c.column_name <> lower(c.column_name) 
  ORDER BY c.table_schema, c.table_name, c.column_name;

*出典:https ://www.postgresonline.com/article_pfriendly/141.html 。ここでは何も変更する必要がないことに注意してください。

次に、結果をテキストファイルにエクスポートします。

ここに画像の説明を入力してください

.csvファイルをExcel、メモ帳、または任意のテキストエディタで開きます。最初の行( "ddlsql")を除くすべての行をコピーして、PgAdminの新しいクエリに貼り付けます。二重引用符は必ず削除してください。それを実行して完了します。

于 2021-04-03T17:18:09.580 に答える