poner - nombre de columna dinamico sql
Cambiar el nombre de varias columnas en PostgreSQL (2)
No puedes hacer eso.
Todas las acciones, excepto RENAME y SET SCHEMA, se pueden combinar en una lista de modificaciones múltiples para aplicar en paralelo.
La forma más eficiente es usar ActiveRecord.
Mi tabla tiene un grupo de columnas en el siguiente formato:
_settingA
_settingB
_settingB
Y quiero cambiarles el nombre simplemente para agregar un prefijo de la siguiente manera:
_1_settingA
_1_settingB
_1_settingC
¿Cuál es la forma más rápida / más eficiente de lograr esto?
EDITAR: Debo agregar que tengo muchas más de tres columnas para cambiar el nombre de esta manera. Si tuviera solo tres, lo haría manualmente uno por uno. Y gracias por el votante quienquiera que seas.
No hay un solo enfoque de comando. Obviamente, puede escribir varios comandos para RENAME
por su cuenta, pero permítame introducir alguna mejora :) Como dije en esta respuesta
... para todas esas operaciones de administración masiva, podría usar las tablas del sistema PostgreSQL para generar consultas en lugar de escribirlas a mano
En tu caso sería:
SELECT
''ALTER TABLE '' || tab_name || '' RENAME COLUMN ''
|| quote_ident(column_name) || '' TO ''
|| quote_ident( ''_1'' || column_name) || '';''
FROM (
SELECT
quote_ident(table_schema) || ''.'' || quote_ident(table_name) as tab_name,
column_name
FROM information_schema.columns
WHERE
table_schema = ''schema_name''
AND table_name = ''table_name''
AND column_name LIKE ''/_%''
) sub;
Eso te dará un conjunto de cadenas que son comandos SQL como:
ALTER TABLE schema_name.table_name RENAME COLUMN "_settingA" TO "_1_settingA";
ALTER TABLE schema_name.table_name RENAME COLUMN "_settingB" TO "_1_settingB";
...
No es necesario usar table_schema
en la cláusula WHERE
si su tabla está en esquema public
. También recuerde usar la función quote_ident()
- lea mi respuesta original para más explicación.
Editar:
Cambié mi consulta, por lo que ahora funciona para todas las columnas con el nombre que comienza con guión bajo _
. Debido a que el guión bajo es un carácter especial en la coincidencia de patrones de SQL, debemos evitarlo (usando /
) para encontrarlo de manera práctica.