2012-04-10 7 views
10

ho visto che è possibile convertire tutti i tabelle a caso i nomi insensibili utilizzando i seguenti comandi in psql:Come posso convertire tutte le colonne nel mio database di case insensitive

\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 

mi è stato possibile per dissotterrare un comando per convertire tutte le colonne in maiuscole e minuscole allo stesso modo. Come può essere realizzato?

MODIFICA: Apparentemente il codice precedente converte solo i nomi delle tabelle in lettere minuscole. Sono consapevole che questo codice ALTER TABLE "YourTableName" RENAME TO YourTableName; convertirà in maiuscolo/minuscolo per un nome di tabella. C'è un modo per fare una funzione simile in massa per i nomi delle colonne?

+1

Nel caso in cui faccia la differenza, non è insensibile alla distinzione tra maiuscole e minuscole; questo è convertirli tutti in lettere minuscole. –

+0

Rende anche insensibili le maiuscole e le minuscole perché non ci sono virgolette attorno ai nomi delle colonne quando vengono rinominate. – CSharpened

+0

Vuoi rendere la colonna ** nomi ** senza distinzione tra maiuscole o minuscole ** valori ** quando si confrontano i dati? –

risposta

11

Lungo le stesse linee dell'originale, quindi, si dovrebbe essere in grado di eseguire quanto segue. Ciò rinomina tutte le colonne che non sono già in minuscolo, estraendole da information_schema, generando SQL per le modifiche, archiviandole in un file e quindi eseguendo di nuovo l'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 
+0

Non è solo per una colonna? – CSharpened

+0

No, è per tutti loro. Ho aggiornato il layout per essere più chiaro e ho modificato la query per essere più intelligente (in modo che non si preoccupi di provare a rinominare le colonne già in minuscolo). –

+0

Se è necessario farlo per le sequenze: 'selezionare 'ALTER SEQUENCE' || '"' || sequence_name || '"' || ' RINOMINA A '|| inferiore (sequence_name) || ';' da information_schema.sequences where sequence_schema = 'public' e lower (sequence_name)! = sequence_name; ' –

15

Per impostazione predefinita, tutti gli identificatori non fanno distinzione tra maiuscole e minuscole e PostgreSQL internamente li memorizza in lettere minuscole. Nel caso in cui è necessario disporre di:

  • maiuscole e minuscole
  • caratteri non-ASCII
  • caratteri speciali

entro i propri identificativi, è necessario utilizzare le virgolette doppie (") intorno agli identificatori.

Si prega di controllare this bit della documentazione di PostgreSQL.

EDIT: Dopo il chiarimento, è possibile utilizzare:

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; 

e per le colonne:

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; 

Quindi copiare e incollare l'uscita nel client.

Se stai usando psql, è possibile utilizzare \t per abilitare la modalità file soli, \o <full_file_path> per salvare l'output nel file temporaneo e, infine, \i <full_file_path> per eseguire istruzioni effettive.

+0

Questa è una buona spiegazione dei motivi alla base del problema, ma non è davvero una soluzione alla domanda dell'OP. –

+2

@ElYobo L'OP non indica quale sia il problema. Indica in un commento che ha problemi con l'utilizzo di alias. Quindi sembra che stia provando una soluzione per un problema che non è quello che sta vivendo. –

+0

Forse stiamo leggendo una domanda diversa o è stata modificata da modifiche? Riesco a vedere quanto segue: "Non sono stato in grado di dissotterrare un comando per convertire tutte le colonne in maiuscole e minuscole nello stesso modo. Come può essere ottenuto?". –

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

Emettere un begin; prima di provare questo. Controlla se è corretto. Solo allora emettere un commit;. Se si utilizza uno spazio dei nomi, sostituirlo nella clausola where.

Problemi correlati