2012-04-10 19 views
10

he visto que es posible convertir todos los tablas al caso nombres insensibles mediante los siguientes comandos de psql:¿Cómo puedo convertir todas las columnas en mi base de datos a mayúsculas y minúsculas

\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 

me ha sido imposible para desenterrar un comando para convertir todas las columnas a mayúsculas y minúsculas de la misma manera. ¿Cómo se puede lograr esto?

EDITAR: Al parecer, el código anterior solo convierte los nombres de las tablas en minúsculas. Soy consciente de que este código ALTER TABLE "YourTableName" RENAME A YourTableName; se convertirá en mayúsculas/minúsculas para un nombre de tabla. ¿Hay alguna manera de hacer una función similar en la masa para los nombres de columna?

+1

En caso de que haga una diferencia para usted, eso no es sensible a las mayúsculas y minúsculas; eso los convierte a todos en minúsculas. –

+0

También los hace insensibles a mayúsculas y minúsculas ya que no hay comillas alrededor de los nombres de las columnas cuando se renombran. – CSharpened

+0

¿Desea que los ** nombres de la columna ** no distingan entre mayúsculas y minúsculas o los valores ** de la columna al comparar los datos? –

Respuesta

11

En la misma línea que el original, entonces, debería poder hacer lo siguiente. Esto cambia el nombre de todas las columnas que aún no están en minúsculas, extrayéndolas del esquema de información, generando SQL para los cambios, almacenándolo en un archivo y luego ejecutando el SQL nuevamente.

\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

¿No es esto solo para una columna? – CSharpened

+0

No, es para todos ellos. He actualizado el diseño para que sea más claro y cambié la consulta para que sea más inteligente (para que no se moleste en tratar de cambiar el nombre de las columnas que ya están en minúsculas). –

+0

Si necesita hacerlo para las secuencias: 'seleccionar 'ALTERAR SECUENCIA' || '"' | | sequence_name || '"' || ' RENAME A '|| lower (sequence_name) || ';' from information_schema.sequences donde sequence_schema = 'public' y lower (sequence_name)! = sequence_name; ' –

15

De manera predeterminada, todos los identificadores no distinguen entre mayúsculas y minúsculas, e internamente PostgreSQL los almacena en minúsculas. En caso de que usted necesita tener:

  • casos sensibles
  • caracteres no ASCII
  • caracteres especiales

dentro de sus identificadores, debe utilizar comillas dobles (") alrededor de sus identificadores.

Compruebe this bit de la documentación de PostgreSQL.

EDIT: Después de su aclaración, puede utilizar:

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; 

y para las columnas:

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; 

A continuación, copiar y pegar el resultado en su cliente.

Si está utilizando psql, se puede utilizar para activar el modo \t filas de sólo \o <full_file_path> guardar el resultado en el archivo temporal y, por último, \i <full_file_path> para ejecutar sentencias reales.

+0

Esta es una buena explicación de las razones detrás del problema, pero realmente no es una solución a la pregunta del OP. –

+2

@ElYobo El OP no indica cuál es el problema. Él insinúa en un comentario que tiene problemas con el uso de alias. Entonces parece que está intentando una solución para un problema que no es el que está experimentando. –

+0

¿Quizás estamos leyendo una pregunta diferente, o ha sido modificada por ediciones? Puedo ver lo siguiente: "No he podido desenterrar un comando para convertir todas las columnas a mayúsculas y minúsculas de la misma manera. ¿Cómo se puede lograr esto?". –

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

Emitir una begin; antes de intentar esto. Verifica si es correcto. Solo entonces emita un commit;. Si está usando un espacio de nombres, sustitúyalo en la cláusula where.

Cuestiones relacionadas