Dam*_*ien 18 sql database postgresql truncate
我正在寻找一种简单的方法来删除数据库中的所有数据并保留结构(表,关系等......).我使用postgreSQL,但我认为,如果有命令这样做,它不是postgres特有的.
谢谢,
达米安
Ada*_*tan 30
使用转储模式pg_dump
.删除数据库,重新创建它并加载模式.
将数据库模式(-s标记)转储到文件:
pg_dump -s -f db.dump DB-NAME
Run Code Online (Sandbox Code Playgroud)
删除数据库:
dropdb DB-NAME
Run Code Online (Sandbox Code Playgroud)
重新创建它:
createdb DB-NAME
Run Code Online (Sandbox Code Playgroud)
仅还原架构:
pg_restore db.dump > psql DB-NAME
Run Code Online (Sandbox Code Playgroud)
这应该适用于PostgreSQL; 其他DBMS可能有自己的工具.我不知道有任何通用工具可以做到这一点.
编辑:
在注释之后,您可能希望跳过该dropdb
命令,并简单地使用转储模式创建另一个数据库.如果一切顺利,您可以删除旧数据库:
pg_dump -s -f db.dump DB-NAME
createdb DB-NEW-NAME
pg_restore db.dump > psql DB-NEW-NAME
Run Code Online (Sandbox Code Playgroud)
此时,您在DB-NAME处拥有完整数据库,在DB-NEW-NAME处拥有空架构.在你确定一切正常后,使用dropdb DB-NAME
.
小智 6
你可以这样做:
export PGUSER=your_pg_user
export PGHOST=database.host
export PGPORT=port
export PGDATABASE=your_database
psql -qAtX -c "select 'TRUNCATE table ' || quote_ident(table_schema) || '.' || quote_ident(table_name) || ' CASCADE;' from information_schema.tables where table_type = 'BASE TABLE' and not table_schema ~ '^(information_schema|pg_.*)$'" | psql -qAtX
Run Code Online (Sandbox Code Playgroud)
它将做必要的事情.
当然这些导出不是必需的,但是它们可以使运行2个psql副本变得更加简单,而不必为它们提供所有标准的-U,-d等交换机.
但是有一件事 - 使用TRUNCATE这样做,虽然比DELETE快,但它有drowbacks - 例如 - 它没有被Slony和任何其他适用于触发器的复制系统复制.除非您正在使用PostgreSQL 8.4,并且您的复制知道如何在TRUNCATE上使用触发器.