如何清空SQL数据库?

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上使用触发器.