截断数据库中所有表的数据
TRUNCATE data from all tables in a Database
对于某些工作,需求是我们希望保留table和数据库结构,同时截断多个table中的所有数据。
由于 Truncate Table_name 一次只截断一个 table。有没有办法截断多个 table?帮助将不胜感激。
你的表有关系吗?如果是这样,您不能截断表 .. 但是要删除所有数据和 Reseed Identity,请使用此查询
EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
--Disable all triggers
EXEC sp_MSForEachTable 'ALTER TABLE ? DISABLE TRIGGER ALL'
--Delete
-- Then reseed if Table has identity column
EXEC sp_MSForEachTable 'IF (''?'' NOT LIKE ''%CNF_tb%'')
BEGIN
DELETE from ?
if @@RowCount >0
BEGIN
IF (Select OBJECTPROPERTY(OBJECT_ID(''?''),''Tablehasidentity'')
FROM Sys.Tables
Where object_id=OBJECT_ID(''?''))=1
BEGIN
DBCC CHECKIDENT(''?'' ,Reseed,0)
END
END
END
ELSE
BEGIN
Select ''?'' as ''Not Changed''
END'
--Enable all constraints
EXEC sp_MSForEachTable 'ALTER TABLE ? With Check CHECK CONSTRAINT ALL'
--Enable all triggers
EXEC sp_MSForEachTable 'ALTER TABLE ? ENABLE TRIGGER ALL'
最简单的方法可能如下:
如果你有外键约束那么临时设置一下OFF
.
SET FOREIGN_KEY_CHECKS=0;
再次设置ON
:
SET FOREIGN_KEY_CHECKS=1;
截断特定数据库下的所有表
SELECT
CONCAT('TRUNCATE TABLE ',TABLE_NAME,';') AS truncateCommand
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'YOUR_DATABASE_NAME_HERE';
从所有数据库中截断所有表
SELECT
CONCAT('TRUNCATE TABLE ',TABLE_NAME,';') AS truncateCommand
FROM information_schema.TABLES;
你会得到这样的输出:
TRUNCATE TABLE your_table_1;
TRUNCATE TABLE your_table_2;
TRUNCATE TABLE your_table_3;
TRUNCATE TABLE your_table_4;
TRUNCATE TABLE your_table_5;
TRUNCATE TABLE your_table_6;
TRUNCATE TABLE your_table_7;
TRUNCATE TABLE your_table_8;
.
.
etc..
现在获取这些截断命令并全部执行。
当且仅当它是一次性工作时,您可以采用这种方式来避免编写存储过程来完成它的麻烦
遗憾的是,没有同时截断所有表的解决方案。
对于那些使用 PHP/PDO 的人,我提出了以下解决方案:
$pdo->query('SET FOREIGN_KEY_CHECKS = 0;');
$tables = $pdo->prepare('SHOW TABLES');
$tables->execute();
foreach ($tables->fetchAll(\PDO::FETCH_COLUMN) as $table)
$pdo->query('TRUNCATE TABLE `'.$table.'`')->execute();
$pdo->query('SET FOREIGN_KEY_CHECKS = 1;');
对于某些工作,需求是我们希望保留table和数据库结构,同时截断多个table中的所有数据。 由于 Truncate Table_name 一次只截断一个 table。有没有办法截断多个 table?帮助将不胜感激。
你的表有关系吗?如果是这样,您不能截断表 .. 但是要删除所有数据和 Reseed Identity,请使用此查询
EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
--Disable all triggers
EXEC sp_MSForEachTable 'ALTER TABLE ? DISABLE TRIGGER ALL'
--Delete
-- Then reseed if Table has identity column
EXEC sp_MSForEachTable 'IF (''?'' NOT LIKE ''%CNF_tb%'')
BEGIN
DELETE from ?
if @@RowCount >0
BEGIN
IF (Select OBJECTPROPERTY(OBJECT_ID(''?''),''Tablehasidentity'')
FROM Sys.Tables
Where object_id=OBJECT_ID(''?''))=1
BEGIN
DBCC CHECKIDENT(''?'' ,Reseed,0)
END
END
END
ELSE
BEGIN
Select ''?'' as ''Not Changed''
END'
--Enable all constraints
EXEC sp_MSForEachTable 'ALTER TABLE ? With Check CHECK CONSTRAINT ALL'
--Enable all triggers
EXEC sp_MSForEachTable 'ALTER TABLE ? ENABLE TRIGGER ALL'
最简单的方法可能如下:
如果你有外键约束那么临时设置一下OFF
.
SET FOREIGN_KEY_CHECKS=0;
再次设置ON
:
SET FOREIGN_KEY_CHECKS=1;
截断特定数据库下的所有表
SELECT
CONCAT('TRUNCATE TABLE ',TABLE_NAME,';') AS truncateCommand
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'YOUR_DATABASE_NAME_HERE';
从所有数据库中截断所有表
SELECT
CONCAT('TRUNCATE TABLE ',TABLE_NAME,';') AS truncateCommand
FROM information_schema.TABLES;
你会得到这样的输出:
TRUNCATE TABLE your_table_1;
TRUNCATE TABLE your_table_2;
TRUNCATE TABLE your_table_3;
TRUNCATE TABLE your_table_4;
TRUNCATE TABLE your_table_5;
TRUNCATE TABLE your_table_6;
TRUNCATE TABLE your_table_7;
TRUNCATE TABLE your_table_8;
.
.
etc..
现在获取这些截断命令并全部执行。
当且仅当它是一次性工作时,您可以采用这种方式来避免编写存储过程来完成它的麻烦
遗憾的是,没有同时截断所有表的解决方案。
对于那些使用 PHP/PDO 的人,我提出了以下解决方案:
$pdo->query('SET FOREIGN_KEY_CHECKS = 0;');
$tables = $pdo->prepare('SHOW TABLES');
$tables->execute();
foreach ($tables->fetchAll(\PDO::FETCH_COLUMN) as $table)
$pdo->query('TRUNCATE TABLE `'.$table.'`')->execute();
$pdo->query('SET FOREIGN_KEY_CHECKS = 1;');