zen*_*zen 31
在保留模式的同时截断所有表的最简单方法.
mysqldump -d -uuser -ppass --add-drop-table databasename > databasename.sql
mysql -uuser -ppass databasename < databasename.sql
Run Code Online (Sandbox Code Playgroud)
不确定它是否会保留存储过程,因为它们在我工作的地方没有使用,但我会定期使用它来重置数据库.
-dmysqldump上的开关意味着"不要转储数据".
在--add-drop-table预先设置成DROP TABLE语句的每一个垃圾堆CREATE TABLE.
pax*_*blo 12
我不这么认为(但我以前错了).我倾向于做的是这些案件分为两个步骤.
如果您的DBMS具有命令行界面,您可以使用它来创建脚本来完成大部分工作,例如:
db2 "select 'db2 delete from ' | tblname from sysibm.systables
where owner = 'pax'" >p2.sh
p2.sh
Run Code Online (Sandbox Code Playgroud)
第一位只是创建一个p2.sh文件(或p2.cmdWindows下的文件),其中包含delete from每个拥有的表的语句pax.然后你只需运行该命令文件来完成脏工作.您当然可以先检查一下,当然:-)
不是您正在寻找的一步过程,但仍然非常简单.我在这里假设mysql也有一个命令行界面.
更新:
上面的MySQL版本看起来应该是:
echo "select 'mysql truncate table ' | table_name
from information_schema.tables" | mysql >p2.sh
bash p2.sh
Run Code Online (Sandbox Code Playgroud)
这使用的truncate命令通常比delete from删除所有行更有效.它还使用正确的MySQL系统表来获取表名.
但有一点 - 您可能希望where在该选择上放置一个子句,以将表限制为您想要删除的表.现在的查询将尝试删除每个表.一种可能性是用特定table_schema和/或table_type值来限制它.
清除数据库中所有表的最强大的方法是由kostanos在如何从命令行中删除所有MySQL表而没有DROP数据库权限提交的?
由于下面的代码清除了当前数据库中的所有表,因此您可能希望在继续之前选择其他数据库.
USE DATABASE_YOU_WANT_TO_CLEAR;
Run Code Online (Sandbox Code Playgroud)
片段后,即使存在外键约束,也会从表中删除数据.您可能还想在实际清理之前仔细检查表列表,以防您忘记选择正确的数据库.
-- 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;
Run Code Online (Sandbox Code Playgroud)
这将需要一个循环遍历每个表的存储过程或脚本,并执行:
truncate table <tablename>
要获取要截断的表列表,您可以执行以下操作:
SELECT table_name
FROM INFORMATION_SCHEMA.tables
WHERE table_schema = 'db_name'
Run Code Online (Sandbox Code Playgroud)
小智 7
在命令行中...
USE dbname
SET foreign_key_checks = 0;
TRUNCATE tablename; //do this for each table you want emptied
SET foreign_key_checks = 1;
Run Code Online (Sandbox Code Playgroud)