【问题标题】:TRUNCATE data from all tables in a DatabaseTRUNCATE 来自数据库中所有表的数据
【发布时间】:2016-06-29 02:22:47
【问题描述】:

对于某些工作,要求是我们希望保留表和数据库结构,同时一次性截断多个表中的所有数据。 由于 Truncate Table_name 一次只截断一个表。有没有办法截断多个表?帮助将不胜感激。

【问题讨论】:

标签: mysql sql database truncate


【解决方案1】:

很遗憾,没有解决方案可以一次截断所有表。

对于那些使用 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;');

【讨论】:

    【解决方案2】:

    最简单的方法可能如下:

    如果你有外键约束,那么暂时设置它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..
    

    现在获取这些截断命令并执行所有命令。

    当且仅当它是一次性工作时,您可以使用这种方法来避免编写存储过程来完成它的麻烦

    【讨论】:

    • 每个 TRUNCATE 都是一个 TRANSACTION。你不能在一个事务中做
    • 是的,我不能在一次交易中做到这一点。你是对的。@BerndBuffen
    • @BerndBuffen 你可以找到答案 [stackoverflow.com/questions/44305115/… 在单笔交易中完成
    【解决方案3】:

    你的表有关系吗?如果是这样,您不能截断表。但是要删除所有数据和重新种子身份,请使用此查询

    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'
    

    【讨论】:

      猜你喜欢
      • 2015-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多