Cuando se trabaja con particiones, a menudo es necesario eliminar todas las particiones a la vez.
sin embargo
DROP TABLE tablename*
No funciona. (No se respeta el comodín).
¿Existe una forma elegante (léase: fácil de recordar) de colocar varias tablas en un comando con un comodín?
sql
postgresql
Tom Feiner
fuente
fuente
|| ' CASCADE ';
y es perfectoAquí hay otra respuesta hackear a este problema. Funciona en
ubuntu
y quizás en otros sistemas operativos también. hacer un\dt
símbolo del sistema en postgres (el símbolo del sistema se estaba ejecutando dentrogenome-terminal
en mi caso). Entonces verá muchas tablas en la terminal. Ahora use lactrl+click-drag
funcionalidad degenome-terminal
para copiar todos los nombres de las tablas. Abra Python, realice un procesamiento de cadenas (reemplace '' por '' y luego '\ n' por ',') y obtendrá una lista separada por comas de todas las tablas. Ahora en psql shell haz undrop table CTRL+SHIFT+V
y listo. Sé que es demasiado específico, solo quería compartirlo. :)fuente
DROP TABLE whatever_
y luego presiono TAB, copie todas las tablas al portapapeles, abra sublime, busque / reemplace y reemplace usando expresiones regulares,\s+
para,
y pegue en la terminal.\e
, copie en su lista y coloque comas.Usé esto.
echo "select 'drop table '||tablename||';' from pg_tables where tablename like 'name%'" | \ psql -U postgres -d dbname -t | \ psql -U postgres -d dbname
Sustituya los valores apropiados por
dbname
yname%
.fuente
Siempre me he sentido mucho más cómodo creando un script sql que pueda revisar y probar antes de ejecutarlo que confiar en obtener el plpgsql correcto para que no destruya mi base de datos. Algo simple en bash que selecciona los nombres de las tablas del catálogo y luego crea las declaraciones de caída para mí. Entonces, para 8.4.x obtendría esta consulta básica:
SELECT 'drop table '||n.nspname ||'.'|| c.relname||';' as "Name" FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relkind IN ('r','v','S','') AND n.nspname <> 'pg_catalog' AND n.nspname <> 'information_schema' AND n.nspname !~ '^pg_toast' AND pg_catalog.pg_table_is_visible(c.oid);
A la que puede agregar una cláusula where. (
where c.relname ilike 'bubba%'
)La salida se ve así:
Name ----------------------- drop table public.a1; drop table public.a2;
Entonces, guárdelo en un archivo .sql y ejecútelo con psql -f filename.sql
fuente
drop table
comando para cualquier secuencia que encuentre (relkind = 'S'
).drop table
en una secuencia fallará. En su lugar, elimine'S'
de larelkind IN
cláusula. Si necesita eliminar secuencias,select 'drop sequence'
c.relkind = 'S'
Divulgación: esta respuesta está destinada a usuarios de Linux.
Agregaría algunas instrucciones más específicas a lo que dijo @prongs:
\dt
puede admitir comodines: por lo que puede ejecutar,\dt myPrefix*
por ejemplo, para seleccionar solo las tablas que desea eliminar;CTRL-SHIFT-DRAG
para seleccionar y luegoCTRL-SHIFT-C
copiar el texto;vim
, vayaINSERT MODE
ay pegue las tablas conCTRL-SHIFT-V
;ESC
, luego ejecute:%s/[ ]*\n/, /g
para traducirlo a una lista separada por comas, luego puede pegarlo (excluyendo la última coma) enDROP TABLE % CASCADE
.fuente
Usando herramientas de línea de comandos de Linux, se puede hacer de esta manera:
psql -d mydb -P tuples_only=1 -c '\dt' | cut -d '|' -f 2 | paste -sd "," | sed 's/ //g' | xargs -I{} echo psql -d mydb -c "drop table {};"
NOTA: El último eco está ahí porque no pude encontrar una manera de poner comillas alrededor del comando de soltar, por lo que debe copiar y pegar la salida y agregar las comillas usted mismo.
Si alguien puede solucionar ese problema menor, sería una salsa increíble.
fuente
Entonces enfrenté este problema hoy. Cargué mi servidor db a través de pgadmin3 y lo hice de esa manera. Las tablas están ordenadas alfabéticamente, por lo que cambiar y hacer clic seguido de eliminar funciona bien.
fuente