Regularmente necesito eliminar todos los datos de mi base de datos PostgreSQL antes de una reconstrucción. ¿Cómo haría esto directamente en SQL?
Por el momento, he logrado crear una declaración SQL que devuelve todos los comandos que necesito ejecutar:
SELECT 'TRUNCATE TABLE ' || tablename || ';' FROM pg_tables WHERE tableowner='MYUSER';
Pero no puedo ver una manera de ejecutarlos mediante programación una vez que los tengo.
DECLARE r RECORD;
luego para bucle:FOR r IN SELECT tablename FROM pg_tables LOOP
Los cursores explícitos rara vez se necesitan en plpgsql. Use el cursor implícito más simple y rápido de un
FOR
bucle:Nota: Dado que los nombres de las tablas no son únicos por base de datos, debe asegurarse de que los nombres de las tablas califiquen en el esquema. Además, limito la función al esquema predeterminado 'public'. Adaptarse a sus necesidades, pero asegúrese de excluir los esquemas del sistema
pg_*
yinformation_schema
.Ten mucho cuidado con estas funciones. Atacan tu base de datos. Agregué un dispositivo de seguridad para niños. Comenta la
RAISE NOTICE
línea y descomentaEXECUTE
para preparar la bomba ...format()
requiere Postgres 9.1 o posterior. En versiones anteriores concatena la cadena de consulta de esta manera:Comando único, sin bucle
Como podemos hacer
TRUNCATE
varias tablas a la vez, no necesitamos ningún cursor o bucle:Agregue todos los nombres de tabla y ejecute una sola declaración. Más simple, más rápido:
Llamada:
Consulta refinada
Ni siquiera necesitas una función. En Postgres 9.0+ puedes ejecutar comandos dinámicos en una
DO
declaración. Y en Postgres 9.5+ la sintaxis puede ser aún más simple:Sobre la diferencia entre
pg_class
,pg_tables
yinformation_schema.tables
:Sobre
regclass
y nombres de tablas citadas:Para uso repetido
Cree una base de datos de "plantilla" (nombremos
my_template
) con su estructura vainilla y todas las tablas vacías. Luego pase por un cicloDROP
/CREATE DATABASE
:Esto es extremadamente rápido , porque Postgres copia toda la estructura en el nivel del archivo. No hay problemas de concurrencia u otros gastos generales que lo retrasen.
Si las conexiones concurrentes evitan que se caiga la base de datos, considere:
fuente
DROP DATABASE mydb
, obviamente). ¿Estás confundiendo esquemas con bases de datos, tal vez?DO
comando (como cualquier otra instrucción SQL) se ejecuta exclusivamente en la base de datos actual . Postgres no tiene forma de acceder a otras bases de datos en la misma transacción. Tendría que usar dblink o FDW para hacer eso. Pero sí afecta a todos los esquemas en la base de datos actual, a menos que agregueWHERE t.schemaname = 'public'
para restringir el efecto a un esquema particular en este caso particular.Si tengo que hacer esto, simplemente crearé un esquema sql de db actual, luego soltaré y crearé db, luego cargaré db con el esquema sql.
A continuación se detallan los pasos involucrados:
1) Crear un volcado de esquema de la base de datos (
--schema-only
)pg_dump mydb -s > schema.sql
2) Eliminar base de datos
drop database mydb;
3) Crear base de datos
create database mydb;
4) Esquema de importación
psql mydb < schema.sql
fuente
En este caso, probablemente sería mejor tener una base de datos vacía que use como plantilla y cuando necesite actualizar, descarte la base de datos existente y cree una nueva a partir de la plantilla.
fuente
¿Podría usar SQL dinámico para ejecutar cada declaración a su vez? Probablemente tendría que escribir un script PL / pgSQL para hacer esto.
http://www.postgresql.org/docs/8.3/static/plpgsql-statements.html (sección 38.5.4. Ejecución de comandos dinámicos)
fuente
Puedes hacer esto con bash también:
Deberá ajustar los nombres de esquema, las contraseñas y los nombres de usuario para que coincidan con sus esquemas.
fuente
AUTO_INCREMENT
Versión de limpieza :fuente
Chicos, la forma mejor y limpia es:
1) Crear volcado de esquema de base de datos (--schema-only) pg_dump mydb -s> schema.sql
2) Eliminar la base de datos eliminar la base de datos mydb;
3) Crear base de datos crear base de datos mydb;
4) Importar esquema psql mydb <schema.sql
¡Es trabajo para mí!
Que tengas un buen día. Hiram Walker
fuente
Si puede usar psql , puede usar el
\gexec
comando meta para ejecutar el resultado de la consulta;Tenga en cuenta que
\gexec
se introduce en la versión 9.6fuente
Para eliminar los datos y preservar las estructuras de tabla en pgAdmin , puede hacer:
fuente