我有100个表,每个表有40,000行。我想进入MySQL并从所有表中删除所有行。
...如果可能的话,在1个陈述中?
我想保留数据库和表格。
答案 0 :(得分:29)
在保留架构的同时截断所有表的最简单方法。
mysqldump -d -uuser -ppass --add-drop-table databasename > databasename.sql
mysql -uuser -ppass databasename < databasename.sql
不确定它是否会保留存储过程,因为它们在我工作的地方没有使用,但我会定期使用它来重置数据库。
mysqldump上的-d
开关表示“不转储数据。”
--add-drop-table
将DROP TABLE语句添加到转储中的每个CREATE TABLE。
答案 1 :(得分:11)
我不这么认为(但我以前错了)。我倾向于做的是这些案件分为两个步骤。
如果您的DBMS有一个命令行界面,您可以使用它来创建一个脚本来完成大部分工作,例如:
db2 "select 'db2 delete from ' | tblname from sysibm.systables
where owner = 'pax'" >p2.sh
p2.sh
第一位只是创建一个p2.sh
文件(或Windows下的p2.cmd
文件),其中包含delete from
所拥有的每个表的pax
语句。然后你只需运行该命令文件来完成脏工作。当然,你可能想先检查一下: - )
不是您正在寻找的一步过程,但仍然非常简单。我假设mysql也有一个命令行界面。
更新
以上的MySQL版本应该是:
echo "select 'mysql truncate table ' | table_name
from information_schema.tables" | mysql >p2.sh
bash p2.sh
这使用truncate
命令,该命令通常比delete from
更有效地删除所有行。它还使用正确的MySQL系统表来获取表名。
有一点 - 您可能希望在该选择上放置where
子句,以将表限制为要删除的表。现在的查询将尝试删除每个表。一种可能性是使用特定table_schema
和/或table_type
值来限制它。
答案 2 :(得分:9)
kostanos在How to remove all MySQL tables from the command-line without DROP database permissions?
中提交了清除数据库中所有表格的最有效方法由于下面的代码清除了当前数据库中的所有表,因此您可能希望在继续之前选择其他数据库。
USE DATABASE_YOU_WANT_TO_CLEAR;
即使存在外键约束,以下代码段也会从表中删除数据。您可能还想在实际清理之前仔细检查表列表,以防您忘记选择正确的数据库。
-- save current foreign key settings and disable foreign key checks
SET @OLD_FOREIGN_KEY_CHECKS=@@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 FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
答案 3 :(得分:7)
这将需要一个循环遍历每个表的存储过程或脚本,并执行:
truncate table <tablename>
要获取要截断的表列表,您可以执行以下操作:
SELECT table_name
FROM INFORMATION_SCHEMA.tables
WHERE table_schema = 'db_name'
答案 4 :(得分:4)
导出SQL脚本,删除数据库,根据脚本重新创建数据库。 :)
答案 5 :(得分: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]
--no-data
开关仅保留数据库表信息,并将忽略所有表数据;您只需重新导入生成的.sql
文件即可重新获取所有表信息。
答案 6 :(得分:4)
在命令行中......
USE dbname
SET foreign_key_checks = 0;
TRUNCATE tablename; //do this for each table you want emptied
SET foreign_key_checks = 1;
答案 7 :(得分:2)
我必须恢复缺少create语句的备份。所以我恢复了较旧的备份,但我不得不摆脱数据。这个oneliner帮助我截断了一切。
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
使用换行符再次提高可读性:
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
请务必使用不带换行符的字符串,并将myschema
替换为您的表架构,并为mysql进程设置正确的登录凭据或主机。
答案 8 :(得分:1)
这是可能的,但它有你可能不喜欢的副作用:
drop database <dbname>;
这意味着删除了表的结构,以及索引,存储过程等等。
唯一的另一种方法是编写一个以某种方式循环
的存储过程truncate table <tablename>;
答案 9 :(得分: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<=@countOfAllTables 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 ;
答案 10 :(得分:1)
这个在MySQL 5中适用于我,它特定于表格:
echo 'show tables' | mysql --skip-column-names -u root YOUR_DB | awk '{print "truncate table " $0 ";"}' | mysql -u root YOUR_DB
将YOUR_DB替换为您的数据库名称。你必须提供两次密码,这样你才有机会再次考虑......; - )
答案 11 :(得分:0)
为什么你不能只导出数据库的结构,删除数据库,然后重新创建它并导入结构?
答案 12 :(得分:0)
首先通过cPanel或Plesk访问phpMyAdmin。
答案 13 :(得分:-1)
这两行剧本是最好的......试试吧
EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
GO
EXEC sp_MSForEachTable 'DELETE FROM ?'
GO
答案 14 :(得分:-1)
使用MySQL Workbench获取数据库的实体关系图(在Workbench:Database - &gt; Reverse Engineer中)。然后删除数据库。然后使用Workbench(数据库 - &gt;正向工程师)创建数据库。
答案 15 :(得分:-4)
只是一个猜测......试试吧
TRUNCATE TABLE *;
或者
TRUNCATE TABLE table1,table2,table3;
或者
DELETE FROM table1,table2,table3 WHERE 1 = 1;