从MYSQL中的所有表中删除数据

时间:2009-12-11 00:36:19

标签: sql mysql

我有100个表,每个表有40,000行。我想进入MySQL并从所有表中删除所有行。

...如果可能的话,在1个陈述中?

我想保留数据库和表格。

16 个答案:

答案 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)

kostanosHow 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。

  1. 选择您要使用的数据库(在phpMyAdmin主页上,从左列的数据库列表中选择)。
  2. 表格列表将显示在左列和右列。
  3. 检查您要截断的表(仅删除数据)。
  4. 在最初显示“已选择:”的下拉框中,从此列表中选择“空”。
  5. 它将询问您是否真的要截断表。检查并确保选择了您真正想要截断的表。
  6. 单击“是”以从表中截断(删除数据)。

答案 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;