2010-01-22 29 views
18

Tôi đang tìm kiếm một cách đơn giản để xóa tất cả dữ liệu khỏi cơ sở dữ liệu và giữ cấu trúc (bảng, mối quan hệ, v.v ...). Tôi sử dụng postgreSQL nhưng tôi nghĩ, nếu có một lệnh để làm điều đó, nó không cụ thể cho postgres.Làm thế nào để làm trống một cơ sở dữ liệu SQL?

Cảm ơn,

Damien

+1

Bạn should't đổ db cho điều này operation.This vấn đề có thể giải quyết hiệu quả hơn. http://stackoverflow.com/questions/2829158 – ijusti

Trả lời

28

Dump lược đồ bằng cách sử dụng pg_dump. thả cơ sở dữ liệu, tạo lại và tải giản đồ.

Dump bạn schema cơ sở dữ liệu (thẻ -s) vào một tập tin:

pg_dump -s -f db.dump DB-NAME 

Xóa cơ sở dữ liệu:

dropdb DB-NAME 

Tái nó:

createdb DB-NAME 

Restore schema chỉ :

pg_restore db.dump > psql DB-NAME 

Điều này sẽ hoạt động trên PostgreSQL; DBMS khác có thể có công cụ riêng của họ cho điều đó. Tôi không biết bất kỳ công cụ chung nào để làm điều đó.

EDIT:

ý kiến ​​sau đây, bạn có thể muốn bỏ qua lệnh dropdb, và chỉ đơn giản là tạo ra một cơ sở dữ liệu với schema đổ. Nếu tất cả đều tốt đẹp, bạn có thể xóa cơ sở dữ liệu cũ:

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

Tại thời điểm này, bạn có toàn bộ cơ sở dữ liệu tại DB-NAME và lược đồ trống tại DB-NEW-NAME. sau khi bạn chắc chắn mọi thứ đều ổn, hãy sử dụng dropdb DB-NAME.

+1

Một tùy chọn thú vị. Tôi sẽ cảnh giác với nó, tuy nhiên. Tôi đoán tôi chỉ lo lắng về việc thả toàn bộ cơ sở dữ liệu, nhưng đó chỉ là tôi. :) – ZombieSheep

+0

Không cần phải cảnh giác. Nếu OP muốn có một cách để cắt bớt toàn bộ cơ sở dữ liệu, thì đây là cách tốt hơn để làm điều đó. Không có nhật ký nào để cắt ngắn và nhanh hơn nhiều. – Timothy

+0

Buồn khi nhận ra không có cách nào đơn giản hơn để làm điều này, Thanks anyway – Damien

2

Tôi không phải là một chàng trai Postgres, nhưng một trong những lựa chọn sẽ được lặp thông qua các bảng và ban hành một lệnh Truncate chống lại mỗi một. Tuy nhiên, bạn sẽ phải xem xét các mối quan hệ có thể đọc được - bạn sẽ không thể xóa dữ liệu tham chiếu trước khi dữ liệu đề cập đến dữ liệu đó.

6

Bạn có thể làm một cái gì đó như thế này:

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 

Nó sẽ làm những gì cần thiết.

Tất nhiên việc xuất khẩu này là không cần thiết, nhưng chúng sẽ đơn giản hơn để chạy 2 bản sao của psql mà không cần phải cho chúng tất cả các tiêu chuẩn -U, -d, v.v. Một điều mặc dù - bằng cách sử dụng TRUNCATE để làm như vậy, trong khi nhanh hơn DELETE, có drowbacks của nó - ví dụ - nó không được nhân rộng bởi Slony và bất kỳ hệ thống nhân rộng khác hoạt động trên các trigger. Trừ khi bạn đang làm việc trên PostgreSQL 8.4, và bản sao của bạn biết cách sử dụng các trigger trên TRUNCATE.

-1

bạn có thể xóa tất cả hồ sơ của cơ sở dữ liệu của bạn mà không hạn chế các phím nước ngoài bằng cách làm theo ba bước

  1. Đưa kịch bản của cơ sở dữ liệu của bạn
    1. Kích chuột phải vào cơ sở dữ liệu của bạn (DB Tên của bạn)
    2. nhấp vào công việc và sau đó "Tạo tập lệnh"
    3. Chỉ định vị trí
  2. Xóa cơ sở dữ liệu của bạn
  3. tái tạo một cơ sở dữ liệu có cùng tên và chạy bạn kịch bản tạo ra

Bằng cách này bạn có thể làm rỗng tất cả các cơ sở dữ liệu của bạn

+0

" nhấp chuột phải vào cơ sở dữ liệu của bạn "dùng để chỉ một trình khách SQL (GUI) cụ thể. Bạn nên đề cập đến SQL client nào bạn đang đề cập đến. –

+0

Máy chủ Microsft Sql @a_horse_with_no_name cảm ơn vì đã chỉ ra –

+2

Câu hỏi đặt ra là cho Postgres, không phải cho SQL Server. –

1

Trong pgAdmin bạn có thể làm:

  • Nhấp chuột phải vào cơ sở dữ liệu -> sao lưu, chọn "Chỉ lược đồ"
  • Thả cơ sở dữ liệu
  • Tạo một cơ sở dữ liệu mới và đặt tên nó như cựu
  • Kích chuột phải vào cơ sở dữ liệu mới -> restore -> chọn sao lưu, chọn "Schema chỉ"
Các vấn đề liên quan