¿Cómo puedo eliminar todas las tablas en una base de datos PostgreSQL?
¿Cómo puedo eliminar todas las tablas en PostgreSQL, trabajando desde la línea de comandos?
No quiero eliminar la base de datos en sí, solo todas las tablas y todos los datos que contienen.
Si todas sus tablas están en un solo esquema, este enfoque podría funcionar (el código siguiente supone que el nombre de su esquema es public
)
DROP SCHEMA public CASCADE;
CREATE SCHEMA public;
Si está utilizando PostgreSQL 9.3 o posterior, es posible que también necesite restaurar las concesiones predeterminadas.
GRANT ALL ON SCHEMA public TO postgres;
GRANT ALL ON SCHEMA public TO public;
Puede escribir una consulta para generar un script SQL como este:
select 'drop table "' || tablename || '" cascade;' from pg_tables;
O:
select 'drop table if exists "' || tablename || '" cascade;' from pg_tables;
En caso de que algunas tablas se eliminen automáticamente debido a la opción de cascada en una oración anterior.
Además, como se indica en los comentarios, es posible que desee filtrar las tablas que desea eliminar por nombre de esquema:
select 'drop table if exists "' || tablename || '" cascade;'
from pg_tables
where schemaname = 'public'; -- or any other schema
Y luego ejecútelo.
El glorioso COPY+PASTE también funcionará.
La respuesta más aceptada al momento de escribir este artículo (enero de 2014) es:
drop schema public cascade;
create schema public;
Esto funciona, sin embargo, si su intención es restaurar el esquema público a su estado original, esto no cumple completamente la tarea. En pgAdmin III para PostgreSQL 9.3.1, si hace clic en el esquema "público" creado de esta manera y mira en el "panel SQL", verá lo siguiente:
-- Schema: public
-- DROP SCHEMA public;
CREATE SCHEMA public
AUTHORIZATION postgres;
Sin embargo, por el contrario, una base de datos nueva tendrá lo siguiente:
-- Schema: public
-- DROP SCHEMA public;
CREATE SCHEMA public
AUTHORIZATION postgres;
GRANT ALL ON SCHEMA public TO postgres;
GRANT ALL ON SCHEMA public TO public;
COMMENT ON SCHEMA public
IS 'standard public schema';
Para mí, usar un marco web Python que crea tablas de bases de datos (web2py), usar el primero causó problemas:
<class 'psycopg2.ProgrammingError'> no schema has been selected to create in
Entonces, en mi opinión, la respuesta totalmente correcta es:
DROP SCHEMA public CASCADE;
CREATE SCHEMA public;
GRANT ALL ON SCHEMA public TO postgres;
GRANT ALL ON SCHEMA public TO public;
COMMENT ON SCHEMA public IS 'standard public schema';
También tenga en cuenta que para emitir estos comandos en pgAdmin III, utilicé la herramienta de consulta (icono de lupa "Ejecutar consultas SQL arbitrarias") o puede usar Complementos-> Consola PSQL
Nota
Si tiene alguna extensión instalada, se eliminará cuando elimine el esquema, por lo que debe tomar nota de lo que necesita instalar y luego ejecutar las declaraciones según sea necesario. P.ej
CREATE EXTENSION postgis;
Puedes eliminar todas las tablas con
DO $$ DECLARE
r RECORD;
BEGIN
-- if the schema you operate on is not "current", you will want to
-- replace current_schema() in query with 'schematodeletetablesfrom'
-- *and* update the generate 'DROP...' accordingly.
FOR r IN (SELECT tablename FROM pg_tables WHERE schemaname = current_schema()) LOOP
EXECUTE 'DROP TABLE IF EXISTS ' || quote_ident(r.tablename) || ' CASCADE';
END LOOP;
END $$;
En mi opinión, esto es mejor que drop schema public
, porque no es necesario recrear schema
y restaurar todas las subvenciones.
La ventaja adicional es que esto no requiere un lenguaje de secuencias de comandos externo ni copiar y pegar el SQL generado en el intérprete.
Si todo lo que deseas eliminar es propiedad del mismo usuario, entonces puedes usar:
drop owned by the_user;
Esto eliminará todo lo que posee el usuario.
Eso incluye vistas materializadas, vistas, secuencias, activadores, esquemas, funciones, tipos, agregados, operadores, dominios, etc. (en realidad: todo ) que the_user
posee (=creado).
Debe reemplazarlo the_user
con el nombre de usuario real; actualmente no hay ninguna opción para descartar todo para "el usuario actual". La próxima versión 9.5 tendrá la opción drop owned by current_user
.
Más detalles en el manual: http://www.postgresql.org/docs/current/static/sql-drop-owned.html