Tôi có 100 bảng, 40.000 hàng trong mỗi bảng. Tôi muốn chuyển sang MySQL và xóa tất cả hàng từ tất cả bảng.Xóa dữ liệu khỏi tất cả các bảng trong MYSQL
... trong 1 câu lệnh, nếu có thể?
Tôi muốn giữ cơ sở dữ liệu và bảng.
Tôi có 100 bảng, 40.000 hàng trong mỗi bảng. Tôi muốn chuyển sang MySQL và xóa tất cả hàng từ tất cả bảng.Xóa dữ liệu khỏi tất cả các bảng trong MYSQL
... trong 1 câu lệnh, nếu có thể?
Tôi muốn giữ cơ sở dữ liệu và bảng.
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ể.
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>;
Tôi muốn giữ lại cơ sở dữ liệu và bảng. – TIMEX
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;
Đ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'
+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 –
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.
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
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. :)
$ 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.
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
Điều này sẽ không hoạt động đối với MySQL. – Lunc
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 ;
và obvioulsy sau khi tạo thủ tục đó bạn sẽ viết gọi cleanAllTables; – Machoo
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 ... ;-)
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?
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;
Đây là một câu trả lời đáng yêu. Nên là một trong những chấp nhận. –
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 –
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.
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
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).
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;
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. –