2009-12-11 84 views

Trả lời

10

Tôi không nghĩ vậy (nhưng tôi đã sai trước đây). Những gì tôi có xu hướng làm là những trường hợp đó là một quá trình gồm hai bước.

Nếu DBMS của bạn có một giao diện dòng lệnh, bạn có thể sử dụng nó để tạo ra một kịch bản để làm phần lớn công việc, cái gì đó như:

db2 "select 'db2 delete from ' | tblname from sysibm.systables 
    where owner = 'pax'" >p2.sh 
p2.sh 

Các bit đầu tiên chỉ đơn giản là tạo ra một tập tin p2.sh (hoặc một p2.cmd tệp dưới Windows) có chứa tuyên bố delete from cho mỗi bảng thuộc sở hữu của pax. Sau đó, bạn chỉ cần chạy tập tin lệnh đó để thực hiện công việc dơ bẩn. Bạn có thể muốn kiểm tra nó trước, tất nhiên :-)

Không phải là quy trình một bước mà bạn đang tìm kiếm nhưng vẫn rất đơn giản. Tôi giả định ở đây rằng mysql cũng có một giao diện dòng lệnh.

Cập nhật:

Phiên bản MySQL của vẻ trên như nó phải là:

echo "select 'mysql truncate table ' | table_name 
       from information_schema.tables" | mysql >p2.sh 
bash p2.sh 

này sử dụng lệnh truncate mà thường là hiệu quả hơn delete from để xóa tất cả các hàng. Nó cũng sử dụng các bảng hệ thống MySQL thích hợp để lấy tên bảng.

Một điểm mặc dù - bạn có thể muốn đặt mệnh đề where vào đó chọn giới hạn các bảng cho những người bạn muốn xóa. Truy vấn như nó đứng sẽ cố gắng xóa mọi bảng. Một khả năng là giới hạn nó với các giá trị table_schema và/hoặc table_type cụ thể.

+0

tất nhiên không phải là giải pháp cuối cùng nhưng phpMyAdmin cho phép để làm điều đó trong ít hơn 5sec ... Bạn có thể chọn tất cả các bảng và chỉ áp dụng một truncate cho tất cả chúng. –

1

Có thể, nhưng nó có tác dụng phụ, bạn có thể không thích:

drop database <dbname>; 

Nó có nghĩa là cấu trúc của bảng được xóa bỏ, cũng như các chỉ số, các thủ tục lưu trữ, vv, vv

cách duy nhất khác sẽ được để viết một stored procedure mà vòng bằng cách nào đó với

truncate table <tablename>; 
+1

Tôi muốn giữ lại cơ sở dữ liệu và bảng. – TIMEX

-3

chỉ cần một đoán ... thử nó

0.123.

BẢNG TRUNCATE *;

Hoặc

TRUNCATE TABLE table1, table2, table3;

Hoặc

DELETE FROM table1, table2, table3 WHERE 1 = 1;

+0

Tôi chưa bao giờ thấy quảng cáo và cũng không được triển khai ở bất cứ đâu. Nó có hoạt động không? – wallyk

+0

Không có ý tưởng, nhưng nó sẽ được tốt đẹp nếu nó đã làm! –

+1

"WHERE 1 = 1" là quá mức và do đó không cần thiết. – mctom987

6

Điều này đòi hỏi một thủ tục lưu trữ hoặc kịch bản đó lặp qua mỗi bảng và làm:

truncate table <tablename>

Để có được danh sách các bảng để cắt ngắn bạn có thể làm một cái gì đó như:

SELECT table_name 
FROM INFORMATION_SCHEMA.tables 
WHERE table_schema = 'db_name' 
+0

+1: Bạn sẽ xem xét sử dụng Tuyên bố được chuẩn bị để có thể lặp qua các bảng: http://dev.mysql.com/tech-resources/articles/4.1/prepared-statements.html –

27

Phương pháp dễ nhất để cắt ngắn tất cả các bảng trong khi giữ lại lược đồ.

mysqldump -d -uuser -ppass --add-drop-table databasename > databasename.sql 

mysql -uuser -ppass databasename < databasename.sql 

Không chắc chắn nó sẽ giữ lại các thủ tục được lưu trữ vì chúng không được sử dụng ở nơi tôi làm việc, nhưng tôi thường xuyên sử dụng để đặt lại cơ sở dữ liệu.

Công tắc -d trên mysqldump có nghĩa là "không đổ dữ liệu".

--add-drop-table thêm một câu lệnh DROP TABLE vào mọi TẠO TẠO trong bãi chứa.

+14

công trình này nhưng thận trọng !!!! nó giảm tất cả các ràng buộc khóa ngoại. – mickeymoon

4

Xuất tập lệnh SQL, xóa cơ sở dữ liệu, tạo lại cơ sở dữ liệu dựa vào tập lệnh. :)

4
$ mysqldump --no-data -u [username] -p[password] [database] > [location] 
$ mysql -u [username] -p[password] 
mysql > drop database [database]; create database [database]; 
mysql > exit; 
$ mysql -u [username] -p[password] [database] < [location] 

Công tắc --no-data chỉ bảo toàn thông tin bảng cơ sở dữ liệu và bỏ qua tất cả dữ liệu bảng; bạn chỉ cần nhập lại tệp .sql được tạo để lấy lại tất cả thông tin bảng.

-1

này hai dòng Script là tốt nhất ... thử nó

EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL' 
GO 
EXEC sp_MSForEachTable 'DELETE FROM ?' 
GO 
+0

Điều này sẽ không hoạt động đối với MySQL. – Lunc

1
DELIMITER $$ 

DROP PROCEDURE IF EXISTS `cleanAllTables`$$ 

CREATE DEFINER=`root`@`%` PROCEDURE `cleanAllTables`() 

BEGIN 

DROP Temporary TABLE IF EXISTS AllTables; 

Create Temporary Table AllTables (

SELECT @curRow := @curRow + 1 AS row_number 
, table_name 
FROM INFORMATION_SCHEMA.tables s 
JOIN (SELECT @curRow := 0 
) r 
WHERE s.table_schema = 'databasename'); 

set @countOfAllTables = (select count(*) from AllTables); 
set @c = 1; 
WHILE @c<[email protected]ntOfAllTables DO 

    set @table_name = (select table_name from AllTables where row_number = @c); 
    set @stmt = concat('Truncate Table ', @table_name); 
    Prepare stmt from @stmt; 
    Execute stmt; 
    SET @c = @c + 1 ; 
END WHILE ; 

END$$ 

DELIMITER ; 
+0

và obvioulsy sau khi tạo thủ tục đó bạn sẽ viết gọi cleanAllTables; – Machoo

1

một này làm việc cho tôi trong MySQL 5, và nó là cụ thể cho bảng:

echo 'show tables' | mysql --skip-column-names -u root YOUR_DB | awk '{print "truncate table " $0 ";"}' | mysql -u root YOUR_DB

Thay thế YOUR_DB bằng tên cơ sở dữ liệu của bạn. Bạn phải cung cấp mật khẩu của mình hai lần, vì vậy bạn có cơ hội nghĩ lại ... ;-)

0

Tại sao bạn không thể xuất cấu trúc cơ sở dữ liệu, xóa cơ sở dữ liệu, sau đó tạo lại và nhập cấu trúc?

4

Cách tốt nhất để xóa tất cả các bảng trong cơ sở dữ liệu đã được gửi bởi kostanos trong How to remove all MySQL tables from the command-line without DROP database permissions?

Kể từ khi đoạn mã sau xóa tất cả các bảng trong cơ sở dữ liệu hiện tại bạn có thể muốn chọn một cơ sở dữ liệu khác nhau trước khi bạn tiến hành.

USE DATABASE_YOU_WANT_TO_CLEAR; 

Đoạn mã sau sẽ xóa dữ liệu khỏi bảng ngay cả khi có ràng buộc khóa ngoài. Bạn cũng có thể muốn kiểm tra lại danh sách các bảng trước khi dọn dẹp thực tế, chỉ trong trường hợp nếu bạn quên chọn cơ sở dữ liệu thích hợp.

-- save current foreign key settings and disable foreign key checks 
SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; 
SET GROUP_CONCAT_MAX_LEN=32768; -- you never know how people name their tables 
SET @tables = NULL; 
SELECT GROUP_CONCAT('`', table_name, '`') INTO @tables 
    FROM information_schema.tables 
    WHERE table_schema = (SELECT DATABASE()); -- operates on the current DB 
SELECT IFNULL(@tables,'dummy') INTO @tables; -- avoid error if there are no tables 

-- At this point you might want to double check the list of tables 
-- to be cleared. Run SELECT @tables; to do so. 

SET @tables = CONCAT('DROP TABLE IF EXISTS ', @tables); 
PREPARE stmt FROM @tables; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 
SET [email protected]_FOREIGN_KEY_CHECKS; 
+0

Đây là một câu trả lời đáng yêu. Nên là một trong những chấp nhận. –

+0

Mặc dù lệnh TRUNCATE chỉ hoạt động cho một bảng tại một thời điểm. Ref. http://stackoverflow.com/questions/15926826/truncate-multi-tables –

1

Tôi phải khôi phục bản sao lưu thiếu các câu lệnh tạo. Vì vậy, tôi đã khôi phục một bản sao lưu cũ hơn nhưng tôi phải loại bỏ dữ liệu. Oneliner này đã giúp tôi cắt ngắn mọi thứ.

mysql -u user -ppass -NBe "SELECT 'SET foreign_key_checks = 0;' UNION SELECT CONCAT('TRUNCATE TABLE myschema.', table_name, ';') FROM INFORMATION_SCHEMA.tables WHERE table_schema = 'myschema' AND table_type = 'BASE TABLE'" | mysql -u user -ppass 

Đối với khả năng đọc tốt hơn nữa với ngắt dòng:

mysql -u user -ppass -NBe "SELECT 'SET foreign_key_checks = 0;' 
    UNION SELECT CONCAT('TRUNCATE TABLE myschema.', table_name, ';') 
    FROM INFORMATION_SCHEMA.tables 
    WHERE table_schema = 'myschema' AND table_type = 'BASE TABLE'" 
     | mysql -u user -ppass 

hãy chắc chắn sử dụng chuỗi mà không cần ngắt dòng và thay thế myschema với schema bảng của bạn và thiết lập các thông tin đăng nhập đúng hoặc máy chủ cho quá trình mysql.

+0

Tôi sẽ lưu một số phỏng đoán, bạn phải thay thế từng thông tin đăng nhập 'user',' password' và db name 'myschema' hai lần. – aitchnyu

-1

Sử dụng Bàn làm việc MySQL để lấy Sơ đồ mối quan hệ thực thể của cơ sở dữ liệu của bạn (trong Workbench: Database -> Reverse Engineer). Sau đó thả cơ sở dữ liệu. Sau đó tạo cơ sở dữ liệu bằng cách sử dụng Workbench (Database -> Forward Engineer).

0

Trong dòng lệnh ...

USE dbname 

SET foreign_key_checks = 0; 
TRUNCATE tablename; //do this for each table you want emptied 
SET foreign_key_checks = 1; 
Các vấn đề liên quan