2012-04-10 6 views
10

ich gesehen habe, zu Fall, dass es möglich ist, alle Tabellen zu konvertieren unempfindlich Namen Fall die folgenden Befehle in psql mit:Wie kann ich konvertieren alle Spalten in der Datenbank unempfindlich

\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 

ich nicht in der Lage gewesen, einen Befehl zum Konvertieren aller Spalten auf Groß- und Kleinschreibung in der gleichen Weise zu finden. Wie kann dies erreicht werden?

EDIT: Anscheinend wandelt der obige Code nur Tabellennamen in Kleinbuchstaben um. Ich bin mir bewusst, dass dieser Code ALTER TABLE "YourTableName" zu YourTableName umbenennt; wird für einen Tabellennamen in Groß- und Kleinschreibung konvertiert. Gibt es eine Möglichkeit, eine ähnliche Funktion für die Spaltennamen auf Masse anzuwenden?

+1

Wenn es einen Unterschied für Sie macht, ist das nicht Groß-und Kleinschreibung; das wandelt sie alle in Kleinbuchstaben um. –

+0

Es macht sie auch nicht case-insensitive tut es nicht, da es keine Anführungszeichen um die Spaltennamen gibt, wenn sie umbenannt werden. – CSharpened

+0

Soll die Spalte ** Namen ** die Groß-/Kleinschreibung nicht beachten oder die Spalte ** Werte ** beim Vergleichen der Daten? –

Antwort

11

Entlang den gleichen Linien wie das Original, dann sollten Sie in der Lage sein, Folgendes zu tun. Dadurch werden alle Spalten, die nicht bereits in Kleinbuchstaben geschrieben sind, umbenannt, indem sie aus dem information_schema extrahiert werden, SQL für die Änderungen generiert wird, in einer Datei gespeichert wird und dann erneut SQL ausgeführt wird.

\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 
+0

Ist das nicht nur für eine Spalte? – CSharpened

+0

Nein, es ist für alle von ihnen. Ich habe das Layout aktualisiert, um klarer zu sein, und die Abfrage so geändert, dass sie schlauer ist (so dass es nicht störend ist, Spalten in Kleinbuchstaben umzubenennen). –

+0

Wenn Sie es für Sequenzen tun müssen: 'wählen Sie 'ALTER SEQUENCE' || '"' || Sequenzname || '"' || ' RENAME TO '|| niedriger (Sequenzname) || ';' aus information_schema.sequences wobei sequence_schema = 'public' und lower (sequence_name)! = sequence_name; ' –

15

Standardmäßig wird bei allen Kennungen zwischen Groß- und Kleinschreibung unterschieden, und PostgreSQL speichert sie intern in Kleinbuchstaben. Für den Fall, müssen Sie haben:

  • case sensitive
  • Nicht-ASCII-Zeichen
  • Sonderzeichen

innerhalb Ihrer Identifikatoren, sollten Sie doppelte Anführungszeichen (") um Ihre Bezeichner verwenden.

Bitte überprüfen Sie this bit der PostgreSQL-Dokumentation.

EDIT: Nach der Klärung, können Sie verwenden:

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; 

und für Spalten:

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; 

Dann die Ausgabe in Ihrem Client copy-paste.

Wenn Sie psql verwenden, können Sie \t verwenden aktivieren Reihen-only-Modus, \o <full_file_path> Ausgabe in die temporäre Datei zu speichern und schließlich \i <full_file_path> tatsächliche Anweisungen auszuführen.

+0

Dies ist eine gute Erklärung der Gründe für das Problem, aber nicht wirklich eine Lösung für die Frage des OP. –

+2

@ElYobo Das OP gibt nicht an, was das Problem ist. Er deutet in einem Kommentar an, dass er Probleme mit der Verwendung von Alias ​​hat. Es scheint also, dass er eine Lösung für ein Problem versucht, das nicht das ist, was er erlebt. –

+0

Vielleicht lesen wir eine andere Frage oder wurden durch Änderungen geändert? Ich kann das folgende oben sehen - "Ich konnte einen Befehl nicht finden, um alle Spalten auf Groß- und Kleinschreibung in der gleichen Weise zu konvertieren. Wie kann dies erreicht werden?". –

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

Ausgabe ein begin; vor diesem Versuch. Überprüfen Sie, ob es korrekt ist. Nur dann geben Sie eine commit; aus. Wenn Sie einen Namespace verwenden, ersetzen Sie ihn in der where-Klausel.

Verwandte Themen