2010-01-22 15 views
18

Sto cercando un modo semplice per eliminare tutti i dati da un database e mantenere la struttura (tavolo, relazione, ecc ...). I utilizzando postgreSQL ma penso che, se c'è un comando per farlo, non è specifico per Postgres.Come svuotare un database SQL?

Grazie,

Damien

+1

È should't discarica db per questo un funzionamento non problema può essere risolto in modo più efficiente. http://stackoverflow.com/questions/2829158 – ijusti

risposta

28

Dump lo schema utilizzando pg_dump. rilasciare il database, ricrearlo e caricare lo schema.

eseguire il dump schema del database (il tag s) in un file:

pg_dump -s -f db.dump DB-NAME 

eliminare il database:

dropdb DB-NAME 

ricrearlo:

createdb DB-NAME 

Ripristinare solo lo schema :

pg_restore db.dump > psql DB-NAME 

Questo dovrebbe funzionare su PostgreSQL; Altri DBMS potrebbero avere i propri strumenti per questo. Non conosco nessuno strumento generico per farlo.

EDIT:

seguito delle osservazioni, si potrebbe desiderare di saltare il comando dropdb, e semplicemente creare un altro database con lo schema oggetto di dumping. Se tutto è andato bene attraverso, è possibile eliminare il vecchio database:

pg_dump -s -f db.dump DB-NAME 
createdb DB-NEW-NAME 
pg_restore db.dump > psql DB-NEW-NAME 

A questo punto, si ha la banca dati completa al DB-NAME, e uno schema vuoto a DB-NEW-NAME. dopo che sei sicuro che tutto sia OK, usa dropdb DB-NAME.

+1

Un'opzione interessante. Ne sarei diffidente, comunque. Immagino di essere solo innervosito dal fatto di lasciar cadere l'intero database, ma sono solo io. :) – ZombieSheep

+0

Non c'è bisogno di essere cauti. Se l'OP vuole comunque un modo per troncare l'intero database, allora questo è un modo migliore per farlo. Nessun log per troncare e molto più veloce. – Timothy

+0

Triste per rendermi conto che non esiste un modo più semplice per farlo, Grazie comunque – Damien

2

io non sono un ragazzo Postgres, ma una possibilità potrebbe essere quella di scorrere le tabelle ed emettere un comando Truncate contro ciascuno di essi. Dovrai prendere in considerazione le relazioni ottibili, ad esempio - non sarà possibile eliminare i dati di riferimento prima dei dati che fanno riferimento ad esso, ad esempio.

6

si può fare qualcosa di simile:

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 

farà ciò che è necessario.

Ovviamente queste esportazioni non sono necessarie, ma renderanno più semplice l'esecuzione di 2 copie di psql senza dover assegnare a tutti gli switch standard -U, -d e così via.

Una cosa però - con TRUNCATE a farlo, mentre più veloce di DELETE, ha il drowbacks - per esempio - non viene replicata da Slony e qualsiasi altro sistema di replica che funziona su trigger. A meno che non si sta lavorando su PostgreSQL 8.4, e la vostra replica sa come usare trigger su TRUNCATE.

-1

tuo può eliminare tutti i record del database senza restrizioni delle chiavi esterne, seguendo tre passaggi

  1. Prendere lo script del database
    1. fare clic destro sul database (il Nome DB)
    2. cliccare sul compito e poi "Genera script"
    3. specificare la posizione
  2. Eliminare la vostra base di dati
  3. ricreare un database con lo stesso nome e si esegue script generato

In questo modo è possibile svuotare tutti i database

+0

" fare clic con il pulsante destro del mouse sul database "fa riferimento a un client SQL (GUI) specifico. Dovresti menzionare a quale client SQL ti stai riferendo. –

+0

Server microsft Sql @a_horse_with_no_name grazie per l'indicazione –

+2

Bene, la domanda è per Postgres, non per SQL Server. –

1

In pgAdmin si può fare:

  • Database con clic destro -> backup, selezionare "Solo schema"
  • Eliminare il database
  • Creare un nuovo database e denominarlo come l'ex
  • destro del mouse sul nuovo database -> Ripristina -> selezionare il backup, selezionare "Schema solo"