How do I drop all tables in psql (PostgreSQL interactive terminal) that starts with a common word?

前端 未结 2 465
一个人的身影
一个人的身影 2021-01-14 21:23

How do I drop all tables whose name start with, say, doors_? Can I do some sort of regex using the drop table command?

I prefer not writing

相关标签:
2条回答
  • 2021-01-14 21:39

    This script will generate the DDL commands to drop them all:

    SELECT 'DROP TABLE ' || t.oid::regclass || ';'
    FROM   pg_class t
    -- JOIN   pg_namespace n ON n.oid = t.relnamespace -- to select by schema
    WHERE  t.relkind = 'r'
    AND    t.relname ~~ E'doors\_%' -- enter search term for table here
    -- AND n.nspname ~~ '%myschema%' -- optionally select by schema(s), too
    ORDER  BY 1;
    

    The cast t.oid::regclass makes the syntax work for mixed case identifiers, reserved words or special characters in table names, too. It also prevents SQL injection and prepends the schema name where necessary. More about object identifier types in the manual.

    About the schema search path.

    You could automate the dropping, too, but it's unwise not to check what you actually delete before you do.

    You could append CASCADE to every statement to DROP depending objects (views and referencing foreign keys). But, again, that's unwise unless you know very well what you are doing. Foreign key constraints are no big loss, but this will also drop all dependent views entirely. Without CASCADE you get error messages informing you which objects prevent you from dropping the table. And you can then deal with it.

    0 讨论(0)
  • 2021-01-14 21:44

    I normally use one query to generate the DDL commands for me based on some of the metadata tables and then run those commands manually. For example:

    SELECT 'DROP TABLE ' || tablename || ';' FROM pg_tables
    WHERE tablename LIKE 'prefix%' AND schemaname = 'public';
    

    This will return a bunch of DROP TABLE xxx; queries, which I simply copy&paste to the console. While you could add some code to execute them automatically, I prefer to run them on my own.

    0 讨论(0)
提交回复
热议问题