Cắt bớt tất cả các bảng trong cơ sở dữ liệu MySQL trong một lệnh?


346

Có một truy vấn (lệnh) để cắt tất cả các bảng trong cơ sở dữ liệu trong một hoạt động không? Tôi muốn biết nếu tôi có thể làm điều này với một truy vấn duy nhất.


1
Cắt bớt tất cả các bảng? bạn có nghĩa là cắt ngắn tất cả các cột của tất cả các bảng trong cơ sở dữ liệu? Ngôn ngữ truy vấn này là gì? (ví dụ: SQL, MySQL, Oracle, Postgres, v.v.)
Jay

Tôi không chắc chắn tôi sẽ khuyên bạn nên làm điều này vì bạn có thể rất dễ gặp rắc rối. Có một lý do tại sao bạn không thể chỉ viết kịch bản cắt ngắn và chạy tập lệnh?
GrayWizardx

cảm ơn 4 câu trả lời nhưng lý do duy nhất không kịch bản nó đang bị thiếu thời gian vì vậy đã nghĩ đến việc chạy một truy vấn trong mysql
devang

ya của nó trong mysql..và truy vấn có nghĩa là một cái gì đó tương tự như cắt bảng tên_bảng..tôi muốn cắt bớt tất cả các hàng của tất cả các bảng trong db của tôi trong một truy vấn
devang

Bạn có thể sử dụng Information_Schema với một con trỏ. Không chắc chắn về MySql, nhưng nó sẽ hỗ trợ Information_Schema.Tables
GrayWizardx

Câu trả lời:


340

Thả (tức là loại bỏ bảng)

mysql -Nse 'show tables' DATABASE_NAME | while read table; do mysql -e "drop table $table" DATABASE_NAME; done

Cắt ngắn (tức là các bảng trống)

mysql -Nse 'show tables' DATABASE_NAME | while read table; do mysql -e "truncate table $table" DATABASE_NAME; done

17
Yup, sạch sẽ, ty. Nhưng bạn có thể cần chạy cái này với -uUSER -pPASSWORD. Ngoài ra, bạn có thể phải chạy nó nhiều lần nếu bạn bị xóa FK trên tầng.
mihaicc

47
Nếu bạn gặp phải các vấn đề về FK như " Không thể xóa hoặc cập nhật hàng cha mẹ: ràng buộc khóa ngoại không thành công ", hãy đảm bảo tắt kiểm tra khóa ngoại bằng cách sửa đổi lệnh như sau:mysql -e "SET FOREIGN_KEY_CHECKS = 0; drop table $table" DATABASE_NAME
Ethan P.

24
Không cần phải lặp máy khách mysql. Đưa nó ra khỏi vòng lặp như thế này:mysql -Nse 'show tables' DATABASE_NAME | while read table; do echo "drop table $table;"; done | mysql DATABASE_NAME
Alexander Shcheblikin

2
@TylerCollier bạn cần một .my.cnf
Felix Eve

2
Dựa trên câu trả lời và nhận xét ở trên và vì chúng không hoạt động như mong đợi đối với tôi, tôi đã tạo một tập lệnh bash đơn giản mà bạn có thể sử dụng cho việc này. Bạn có thể tìm thấy nó tại: gist.github.com/mocanuga/eff26a3dcc40ef657a1c812f68511f6d
mocanuga

145

cắt ngắn nhiều bảng cơ sở dữ liệu trên cá thể Mysql

SELECT Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME, ';') 
FROM INFORMATION_SCHEMA.TABLES where  table_schema in ('db1_name','db2_name');

Sử dụng kết quả truy vấn để cắt bớt các bảng

Lưu ý: có thể bạn sẽ gặp lỗi này:

ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails

Điều đó xảy ra nếu có các bảng có tham chiếu khóa ngoài tới bảng mà bạn đang cố gắng thả / cắt.

Trước khi cắt bớt bảng Tất cả những gì bạn cần làm là:

SET FOREIGN_KEY_CHECKS=0;

Cắt bớt các bảng của bạn và thay đổi nó trở lại

SET FOREIGN_KEY_CHECKS=1;

1
Đây có lẽ là giải pháp tốt nhất nếu bạn có người dùng và mật khẩu cho cơ sở dữ liệu của mình và bạn không muốn nhập chúng rõ ràng vào vỏ của mình.
Bạch

5
Được nâng cấp vì giải pháp này chỉ yêu cầu truy cập DB và không truy cập SSH. Ngoài ra, nó độc lập với hệ điều hành.
mastazi

@mastazi tôi có một vài câu hỏi: 1. "table_schema" là viết tắt của từ gì? nó đang đứng từ tên lược đồ? 2. TABLE_NAME là viết tắt của từ gì? Có phải nó đang đứng cho các bảng nên bị xóa? 3. tôi có nên viết cao các bảng nên xóa tin lệnh như "('db1_name', 'db2_name')" không?
AAEM

@AHmed thay thế duy nhất cần thiết là bạn phải thay thế db1_name và db2_name bằng tên của cơ sở dữ liệu của bạn. Sau đó, bạn phải sao chép kết quả của truy vấn này và dán chúng dưới dạng truy vấn mysql mới và thực hiện chúng. Information_SCHema là một lược đồ tích hợp được cài đặt sẵn trong mỗi lần cài đặt MySQL và lưu giữ thông tin về cơ sở dữ liệu của bạn, đừng chạm vào nó hoặc MySQL của bạn sẽ bắt đầu hoạt động sai: information_schema
mastazi

bởi "db_name", ý bạn là tên của lược đồ? tôi chỉ có 1 lược đồ mà tôi muốn xóa dữ liệu bảng của nó
AAEM

66

Sử dụng phpMyAdmin theo cách này:

Chế độ xem cơ sở dữ liệu => Kiểm tra tất cả (bảng) => Trống

Nếu bạn muốn bỏ qua kiểm tra khóa ngoại, bạn có thể bỏ chọn hộp có nội dung:

[] Cho phép kiểm tra khóa ngoại

Bạn sẽ cần phải chạy ít nhất phiên bản 4.5.0 trở lên để có được hộp kiểm này.

Nó không phải MySQL CLI-fu, nhưng hey, nó hoạt động!


31
ai nói chúng tôi đang chạy PHP ...?
JSH

37
Ai nói chúng tôi đã không? Câu trả lời này rõ ràng chứng tỏ hữu ích cho mọi người; nó giúp.
bzeaman

2
Điều này sẽ không hoạt động nếu bạn có một lược đồ cơ sở dữ liệu cha-con.
Cary Bondoc

2
Ràng buộc khóa ngoại thất bại.
Brian Hannay

2
@BrianHannay Nó đã được thêm vào PMA 4.5.0 vào tháng 6 năm 2015. Tôi đã tìm thấy thay đổivấn đề ban đầu
Nemo

24

MS SQL Server 2005+ (Xóa PRINT để thực thi thực tế ...)

EXEC sp_MSforeachtable 'PRINT ''TRUNCATE TABLE ?'''

Nếu nền tảng cơ sở dữ liệu của bạn hỗ trợ các chế độ xem Information_SCHema, hãy lấy kết quả của truy vấn sau và thực hiện chúng.

SELECT 'TRUNCATE TABLE ' + TABLE_NAME FROM INFORMATION_SCHEMA.TABLES

Hãy thử điều này cho MySQL:

SELECT Concat('TRUNCATE TABLE ', TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES

Thêm dấu chấm phẩy vào Concat giúp sử dụng dễ dàng hơn, ví dụ như từ trong bàn làm việc của mysql.

SELECT Concat('TRUNCATE TABLE ', TABLE_NAME, ';') FROM INFORMATION_SCHEMA.TABLES

hi..cảm ơn vì đã trả lời tôi đã thử truy vấn này nhưng dường như không hoạt động..là một cái gì đó giống như cắt bớt bảng tên_bảng mà tôi có thể sử dụng cho tất cả các bảng trong db của mình ..
devang

Tôi quên rằng MySQL không hỗ trợ trực tiếp toán tử "+". Giả sử đó là lỗi, tôi đã thêm ví dụ CONCAT () ở trên. Nếu bạn vẫn nhận được thông báo lỗi, thì vui lòng chia sẻ thông báo lỗi thực tế.
bãi biển

truy vấn này hoạt động nhưng nếu tôi có tên diff diff, ví dụ như devang..là tên db của tôi thì nếu tôi sử dụng nó theo truy vấn trên của bạn sẽ gây ra lỗi foll .. Bảng 'devang.TABLES' không tồn tại
devang

3
À THÔNG TIN_SCHema là chế độ xem tồn tại trong cơ sở dữ liệu đang hoạt động. Nếu bạn thay đổi cơ sở dữ liệu của mình, thì khung nhìn sẽ được thực thi theo DB đó. Không cần phải sửa đổi truy vấn khi thay đổi cơ sở dữ liệu. Chỉ cần làm theo các bước sau: 1) thay đổi cơ sở dữ liệu hoạt động. 2) chạy tập lệnh. 3) sao chép kết quả 4) dán kết quả lại vào trình chỉnh sửa 5) thực hiện kết quả. Tất cả các bảng trong cơ sở dữ liệu hoạt động hiện đang bị cắt ngắn.
bãi biển

1
HÃY THỬ! Thao tác này chọn tất cả các bảng trong tất cả các cơ sở dữ liệu (ngay cả những bảng KHÔNG có trong cơ sở dữ liệu hiện tại. Ví dụ về MySQL không hoạt động, nhưng trong trường hợp của tôi, nó trả về 293 hàng (bảng) thay vì 66. Hãy tưởng tượng mất dữ liệu ...
f4der

19

Tôi thấy điều này để thả tất cả các bảng trong cơ sở dữ liệu:

mysqldump -uUSERNAME -pPASSWORD --add-drop-table --no-data DATABASENAME | grep ^DROP | mysql -uUSERNAME -pPASSWORD DATABASENAME

Sử dụng đầy đủ nếu bạn bị giới hạn bởi giải pháp lưu trữ (không thể bỏ toàn bộ cơ sở dữ liệu).

Tôi đã sửa đổi nó để cắt bớt các bảng. Không có "--add-truncate-table" cho mysqldump, vì vậy tôi đã làm:

mysqldump -uUSERNAME -pPASSWORD --add-drop-table --no-data DATABASENAME | grep ^DROP | sed -e 's/DROP TABLE IF EXISTS/TRUNCATE TABLE/g' | mysql -uUSERNAME -pPASSWORD DATABASENAME

làm việc cho tôi --edit, sửa lỗi chính tả trong lệnh cuối cùng


15
SET FOREIGN_KEY_CHECKS = 0;

SELECT @str := CONCAT('TRUNCATE TABLE ', table_schema, '.', table_name, ';')
FROM   information_schema.tables
WHERE  table_type   = 'BASE TABLE'
  AND  table_schema IN ('db1_name','db2_name');

PREPARE stmt FROM @str;

EXECUTE stmt;

DEALLOCATE PREPARE stmt;

SET FOREIGN_KEY_CHECKS = 1;

Nếu bạn muốn làm việc với cơ sở dữ liệu hiện tại (và do đó làm cho mã này có thể di động được), hãy thay đổi điều kiện cuối cùng SELECTthành:AND table_schema = DATABASE();
alx

Nó không cắt ngắn cho tôi. MySQL 5.7.25
Lucas Bustamante

14

Tôi thấy đơn giản nhất là chỉ cần làm một cái gì đó giống như mã bên dưới, chỉ cần thay thế tên bảng bằng tên của bạn. điều quan trọng là đảm bảo dòng cuối cùng luôn luôn là FOR FOREIGN_KEY_CHECKS = 1;

SET FOREIGN_KEY_CHECKS=0;
TRUNCATE `table1`;
TRUNCATE `table2`;
TRUNCATE `table3`;
TRUNCATE `table4`;
TRUNCATE `table5`;
TRUNCATE `table6`;
TRUNCATE `table7`;
SET FOREIGN_KEY_CHECKS=1;

7
bạn không phải lặp lại SET FOREIGN_KEY_CHECKS = 0; sau mỗi lệnh TRUNCATE ngay tại vạch xuất phát sẽ đánh dấu chế độ là 0
HMagdy

12

Điều này sẽ in lệnh để cắt tất cả các bảng:

SELECT GROUP_CONCAT(Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME) SEPARATOR ';') FROM INFORMATION_SCHEMA.TABLES where table_schema in ('my_db');

5
  1. Để cắt bớt một bảng, người ta phải bỏ các ràng buộc khóa ngoài được ánh xạ tới các cột trong bảng này từ các bảng khác (thực tế trên tất cả các bảng trong DB / Schema cụ thể).
  2. Vì vậy, tất cả các ràng buộc khóa ngoại phải được loại bỏ ban đầu sau đó là cắt bớt bảng.
  3. Tùy chọn, sử dụng bảng tối ưu hóa (trong mysql, innodb engine) để lấy lại không gian / kích thước dữ liệu đã sử dụng cho HĐH sau khi cắt dữ liệu.
  4. Khi việc cắt dữ liệu được thực hiện, hãy tạo lại các ràng buộc khóa ngoại tương tự trên cùng một bảng. Xem bên dưới một tập lệnh sẽ tạo tập lệnh để thực hiện các hoạt động trên.

    SELECT CONCAT('ALTER TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,' DROP FOREIGN KEY ',CONSTRAINT_NAME,';') FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
    WHERE CONSTRAINT_TYPE='FOREIGN KEY' AND TABLE_SCHEMA='<TABLE SCHEMA>'
    UNION
    SELECT CONCAT('TRUNCATE TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,';') FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_SCHEMA='<TABLE SCHEMA>' AND TABLE_TYPE='BASE TABLE'
    UNION
    SELECT CONCAT('OPTIMIZE TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,';') FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_SCHEMA='<TABLE SCHEMA>' AND TABLE_TYPE='BASE TABLE'
    UNION
    SELECT CONCAT('ALTER TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,' ADD CONSTRAINT ',CONSTRAINT_NAME,' FOREIGN KEY(',COLUMN_NAME,')',' REFERENCES ',REFERENCED_TABLE_NAME,'(',REFERENCED_COLUMN_NAME,');') FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
    WHERE CONSTRAINT_NAME LIKE 'FK%' AND TABLE_SCHEMA='<TABLE SCHEMA>'
    INTO OUTFILE "C:/DB Truncate.sql" LINES TERMINATED BY '\n';

Bây giờ, hãy chạy tập lệnh Db Truncate.sql được tạo

Những lợi ích. 1) Lấy lại không gian đĩa 2) Không cần thiết phải thả và tạo lại DB / Schema với cùng cấu trúc

Hạn chế. 1) Ràng buộc FK phải là tên trong bảng có tên chứa 'FK' trong tên ràng buộc.


3

nếu sử dụng máy chủ sql 2005, có một thủ tục được lưu trữ ẩn cho phép bạn thực thi một lệnh hoặc một tập lệnh đối với tất cả các bảng bên trong cơ sở dữ liệu. Đây là cách bạn sẽ gọi TRUNCATE TABLEvới thủ tục được lưu trữ này:

EXEC [sp_MSforeachtable] @command1="TRUNCATE TABLE ?"

Đây là một bài viết tốt mà chi tiết hơn nữa.

Tuy nhiên, đối với MySql, bạn có thể sử dụng mysqldump và chỉ định --add-drop-tables--no-datacác tùy chọn để loại bỏ và tạo tất cả các bảng bỏ qua dữ liệu. như thế này:

mysqldump -u[USERNAME] -p[PASSWORD] --add-drop-table --no-data [DATABASE]

hướng dẫn sử dụng mysqldump từ dev.mysql


3

Sử dụng cái này và tạo truy vấn

SELECT Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME, ';') 
FROM INFORMATION_SCHEMA.TABLES where  table_schema in (db1,db2)
INTO OUTFILE '/path/to/file.sql';

Bây giờ sử dụng để sử dụng truy vấn này

mysql -u username -p </path/to/file.sql

nếu bạn gặp lỗi như thế này

ERROR 1701 (42000) at line 3: Cannot truncate a table referenced in a foreign key constraint

cách dễ nhất để đi qua là ở đầu tệp của bạn thêm dòng này

SET FOREIGN_KEY_CHECKS=0;

trong đó nói rằng chúng tôi không muốn kiểm tra các ràng buộc khóa ngoại trong khi duyệt qua tệp này.

Nó sẽ cắt tất cả các bảng trong cơ sở dữ liệu db1 và bd2.


tên db phải có trong qoutes
Roman M


2

Đây là biến thể của tôi để có 'một tuyên bố cắt ngắn' tất cả '.

Đầu tiên, tôi đang sử dụng một cơ sở dữ liệu riêng có tên 'produc' cho các thủ tục được lưu trữ của người trợ giúp. Mã của thủ tục được lưu trữ của tôi để cắt bớt tất cả các bảng là:

DROP PROCEDURE IF EXISTS trunctables;
DELIMITER ;;
CREATE  PROCEDURE trunctables(theDb varchar(64))
BEGIN
    declare tname varchar(64);
    declare tcursor CURSOR FOR 
    SELECT table_name FROM information_schema.tables WHERE table_type <> 'VIEW' AND table_schema = theDb;
    SET FOREIGN_KEY_CHECKS = 0; 
    OPEN tcursor;
    l1: LOOP
        FETCH tcursor INTO tname;
        if tname = NULL then leave l1; end if;
        set @sql = CONCAT('truncate `', theDB, '`.`', tname, '`');
        PREPARE stmt from @sql;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
    END LOOP l1;
    CLOSE tcursor;
    SET FOREIGN_KEY_CHECKS = 1; 
END ;;
DELIMITER ;

Khi bạn có quy trình được lưu trữ này trong cơ sở dữ liệu của bạn, bạn có thể gọi nó như

call util.trunctables('nameofdatabase');

mà bây giờ chính xác là một tuyên bố :-)


2

ở đây cho tôi biết ở đây

   SELECT Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME, ';') 
    FROM INFORMATION_SCHEMA.TABLES where  table_schema in ('databasename1','databasename2');

Nếu không thể xóa hoặc cập nhật hàng cha mẹ: một ràng buộc khóa ngoại không thành công

Điều đó xảy ra nếu có các bảng có tham chiếu khóa ngoài tới bảng mà bạn đang cố gắng thả / cắt.

Trước khi cắt bớt bảng Tất cả những gì bạn cần làm là:

SET FOREIGN_KEY_CHECKS=0;

Cắt bớt các bảng của bạn và thay đổi nó trở lại

SET FOREIGN_KEY_CHECKS=1; 

sử dụng mã php này

    $truncate = mysql_query("SELECT Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME, ';') as tables_query FROM INFORMATION_SCHEMA.TABLES where table_schema in ('databasename')");

    while($truncateRow=mysql_fetch_assoc($truncate)){

        mysql_query($truncateRow['tables_query']);

    }
?>

kiểm tra chi tiết ở đây liên kết


1

Đây là một thủ tục nên cắt bớt tất cả các bảng trong cơ sở dữ liệu cục bộ.

Hãy cho tôi biết nếu nó không hoạt động và tôi sẽ xóa câu trả lời này.

Chưa được kiểm tra

CREATE PROCEDURE truncate_all_tables()
BEGIN

   -- Declare local variables
   DECLARE done BOOLEAN DEFAULT 0;
   DECLARE cmd VARCHAR(2000);

   -- Declare the cursor
   DECLARE cmds CURSOR
   FOR
   SELECT CONCAT('TRUNCATE TABLE ', TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES;

   -- Declare continue handler
   DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;

   -- Open the cursor
   OPEN cmds;

   -- Loop through all rows
   REPEAT

      -- Get order number
      FETCH cmds INTO cmd;

      -- Execute the command
      PREPARE stmt FROM cmd;
      EXECUTE stmt;
      DROP PREPARE stmt;

   -- End of loop
   UNTIL done END REPEAT;

   -- Close the cursor
   CLOSE cmds;

END;

Tôi đã mất rất nhiều thời gian để tìm hiểu lý do tại sao điều này không hoạt động .. Sau đó, một nhận xét về chuỗi e-mail này đã giúp: forum.mysql.com/read.php?61,116597,219343#msg-219343 - Để tham khảo : "Thật không may, có vẻ như các câu lệnh chuẩn bị không thể được sử dụng trong các con trỏ. Từ hướng dẫn sử dụng: dev.mysql.com/doc/refman/6.0/en/ Kẻ "
Tominator

1

Tôi thấy rằng BẢNG TRUNCATE .. gặp rắc rối với các ràng buộc khóa ngoại, ngay cả sau khi NOCHECK CONSTRAINT ALL, vì vậy tôi sử dụng câu lệnh XÓA TỪ thay thế. Điều này không có nghĩa là các hạt giống nhận dạng không được đặt lại, bạn luôn có thể thêm CHECKIDENT để đạt được điều này.

Tôi sử dụng mã dưới đây để in ra cửa sổ thông báo sql để cắt bớt tất cả các bảng trong cơ sở dữ liệu, trước khi chạy nó. Nó chỉ làm cho một chút khó khăn hơn để phạm sai lầm.

EXEC sp_MSforeachtable 'PRINT ''ALTER TABLE ? NOCHECK CONSTRAINT ALL'''
EXEC sp_MSforeachtable 'print ''DELETE FROM ?'''
EXEC sp_MSforeachtable 'print ''ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all'''

0

Tôi không chắc nhưng tôi nghĩ có một lệnh sử dụng mà bạn có thể sao chép lược đồ cơ sở dữ liệu vào cơ sở dữ liệu mới, khi bạn đã hoàn thành việc này, bạn có thể xóa cơ sở dữ liệu cũ và sau đó, bạn có thể sao chép lại lược đồ cơ sở dữ liệu sang tên cũ.


1
mysqldump -uuser -ppassword --no-data salesLeadsBrittany> salesLeadsTemplate.sql Điều này sẽ tạo một tệp sql chỉ với lược đồ (không có dữ liệu). Bạn có thể xóa cơ sở dữ liệu sau lệnh này và có thể tạo lại cơ sở dữ liệu bằng cách nhập lược đồ.
GJ.

0

Tôi biết đây không chính xác là một lệnh, nhưng kết quả mong muốn có thể đạt được từ bên trong phpMyAdmin bằng cách làm theo các bước sau:

  1. Chọn (tất cả) bảng cần xóa (Kiểm tra tất cả)
  2. Chọn "Thả" / "Cắt ngắn" từ danh sách "Đã chọn:"
  3. Trên trang xác nhận ("Bạn có thực sự muốn:") sao chép truy vấn (mọi thứ có nền đỏ)
  4. Đi lên trên cùng và nhấp vào SQL và viết: "SET FOREIGN_KEY_CHECKS = 0;" sau đó dán truy vấn đã sao chép trước đó
  5. Nhấp vào "Đi"

Ý tưởng là nhanh chóng lấy tất cả các bảng từ cơ sở dữ liệu (bạn thực hiện trong 5 giây và 2 lần nhấp) nhưng trước tiên hãy vô hiệu hóa kiểm tra khóa ngoại. Không CLI và không bỏ cơ sở dữ liệu và thêm nó một lần nữa.


0
TB=$( mysql -Bse "show tables from DATABASE" );
for i in ${TB};
    do echo "Truncating table ${i}";
    mysql -e "set foreign_key_checks=0; set unique_checks=0;truncate table DATABASE.${i}; set foreign_key_checks=1; set unique_checks=1";
    sleep 1;
done

-

David,

Cảm ơn bạn đã dành thời gian để định dạng mã, nhưng đây là cách nó được áp dụng.

-Kurt

Trên hộp UNIX hoặc Linux:

Hãy chắc chắn rằng bạn đang ở trong một vỏ bash. Các lệnh này sẽ được chạy, từ dòng lệnh như sau.

Ghi chú:

Tôi lưu trữ thông tin đăng nhập của mình trong tệp ~ / .my.cnf của mình, vì vậy tôi không cần cung cấp chúng trên dòng lệnh.

Ghi chú:

cpm là tên cơ sở dữ liệu

Tôi chỉ hiển thị một mẫu nhỏ của kết quả, từ mỗi lệnh.

Tìm các ràng buộc khóa ngoại của bạn:

klarsen@Chaos:~$ mysql -Bse "select concat(table_name, ' depends on ', referenced_table_name)
             from information_schema.referential_constraints
             where constraint_schema = 'cpm'
             order by referenced_table_name"
  1. Phê duyệt_external_system phụ thuộc vào sự chấp thuận
  2. địa chỉ phụ thuộc vào khách hàng
  3. khách hàng xác định phụ thuộc vào khách hàng
  4. bên ngoài phụ thuộc vào khách hàng
  5. thông tin phụ thuộc vào khách hàng
  6. email_address phụ thuộc vào khách hàng
  7. sự chấp thuận phụ thuộc vào khách hàng
  8. customer_status phụ thuộc vào khách hàng
  9. customer_image phụ thuộc vào khách hàng

Liệt kê các bảng và số hàng:

klarsen@Chaos:~$ mysql -Bse "SELECT table_name, table_rows FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'cpm'" | cat -n

 1  address 297
 2  approval_external_system    0
 3  approval_request    0
 4  country 189
 5  credential  468
 6  customer    6776
 7  customer_identification 5631
 8  customer_image  2
 9  customer_status 13639

Cắt bớt các bảng của bạn:

klarsen@Chaos:~$ TB=$( mysql -Bse "show tables from cpm" ); for i in ${TB}; do echo "Truncating table ${i}"; mysql -e "set foreign_key_checks=0; set unique_checks=0;truncate table cpm.${i}; set foreign_key_checks=1; set unique_checks=1"; sleep 1; done
  1. Địa chỉ bảng cắt ngắn
  2. Cắt ngắn bảng phê duyệt_external_system
  3. Cắt ngắn bảng phê duyệt
  4. Cắt ngắn đất nước
  5. Thông tin bảng cắt ngắn
  6. Cắt ngắn bảng khách hàng
  7. Cắt ngắn bảng customer_identifying
  8. Cắt ngắn bảng customer_image
  9. Bảng cắt ngắn customer_status

Xác minh rằng nó hoạt động:

klarsen@Chaos:~$ mysql -Bse "SELECT table_name, table_rows FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'cpm'" | cat -n

 1  address 0
 2  approval_external_system    0
 3  approval_request    0
 4  country 0
 5  credential  0
 6  customer    0
 7  customer_identification 0
 8  customer_image  0
 9  customer_status 0
10  email_address   0

Trên hộp Windows:

GHI CHÚ:

cpm là tên cơ sở dữ liệu

C:\>for /F "tokens=*" %a IN ('mysql -Bse "show tables" cpm') do mysql -e "set foreign_key_checks=0; set unique_checks=0; truncate table %a; foreign_key_checks=1; set unique_checks=1" cpm

0

Truy vấn MySQL sau đây sẽ tự tạo một truy vấn duy nhất sẽ cắt tất cả các bảng trong cơ sở dữ liệu đã cho. Nó bỏ qua các phím NGOẠI TỆ:

SELECT CONCAT(
         'SET FOREIGN_KEY_CHECKS=0; ',
         GROUP_CONCAT(dropTableSql SEPARATOR '; '), '; ',
         'SET FOREIGN_KEY_CHECKS=1;'
       ) as dropAllTablesSql
FROM   ( SELECT  Concat('TRUNCATE TABLE ', table_schema, '.', TABLE_NAME) AS dropTableSql
         FROM    INFORMATION_SCHEMA.TABLES
         WHERE   table_schema = 'DATABASE_NAME' ) as queries

0
mysqldump -u root -p --no-data dbname > schema.sql
mysqldump -u root -p drop dbname
mysqldump -u root -p < schema.sql

0

Sol 1)

mysql> select group_concat('truncate',' ',table_name,';') from information_schema.tables where table_schema="db_name" into outfile '/tmp/a.txt';
mysql> /tmp/a.txt;

Ngày 2)

- Export only structure of a db
- drop the database
- import the .sql of structure 

-- biên tập ----

earlier in solution 1, i had mentioned concat() instead of group_concat() which would have not returned the desired result

1
Điều này dường như chỉ trả về bảng đầu tiên: TRUNCATE bảng1 và quên về tất cả các bảng khác.
Stephen Smith

Giải pháp này chắc chắn sẽ điên rồ. tôi không biết tại sao nó không được bình chọn. có thể là do sai lầm của tôi đã được chỉnh sửa.
Angelin Nadar

0

Điều này làm việc cho tôi. Thay đổi cơ sở dữ liệu, tên người dùng và mật khẩu phù hợp.

mysql -Nse 'show tables' -D DATABASE -uUSER -pPWD | while read table; do echo "SET FOREIGN_KEY_CHECKS = 0;drop table \`$table\`;SET FOREIGN_KEY_CHECKS = 1;"; done | mysql DATABASE -uUSER -pPWD


-1

Một ý tưởng có thể là chỉ cần thả và tạo lại các bảng?

BIÊN TẬP:

@Jonathan Leffler: Đúng

Đề xuất khác (hoặc trường hợp bạn không cần cắt bớt TẤT CẢ các bảng):

Tại sao không chỉ tạo một thủ tục lưu trữ cơ bản để cắt bớt các bảng cụ thể

CREATE PROCEDURE [dbo].[proc_TruncateTables]
AS
TRUNCATE TABLE Table1
TRUNCATE TABLE Table2
TRUNCATE TABLE Table3
GO

Điều đó làm mất tất cả các ràng buộc, quyền, chế độ xem, v.v. trên các bảng - đó là một phiền toái đáng kể.
Jonathan Leffler

Bạn có thể thực hiện xóa, sau đó lục lại tất cả các bảng thay vì cắt ngắn. Tôi cho rằng đánh dấu xuống là sự thất vọng. Chỉ cần khôi phục lại bản sao lưu của bạn.
Mark Redman

-5
<?php
// connect to database
$conn=mysqli_connect("localhost","user","password","database");

// check connection
if (mysqli_connect_errno()) {
  exit('Connect failed: '. mysqli_connect_error());
}

// sql query
$sql =mysqli_query($conn,"TRUNCATE " . TABLE_NAME);


// Print message
if ($sql === TRUE) {
  echo 'data delete successfully';
}
else {
 echo 'Error: '. $conn->error;
}

$conn->close();

?>

Đây là đoạn mã mà tôi sử dụng để xóa bảng. Chỉ cần thay đổi thông tin $ Conn và TABLE_NAME.


hey james, tôi nghĩ rằng OP đang tìm kiếm đầu tiên một lớp lót .... và thứ hai là một lệnh để có được tất cả các bảng một lần và xóa chúng. điều này đòi hỏi một số loại can thiệp của người dùng. cảm ơn vì bài viết mặc dù
Craig Wayne
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.