以下代码使用 PDO 导出指定表的数据,并生成包含 TRUNCATE TABLE 语句的 SQL 文件,确保导入前清空目标表

<?php
// 数据库配置
$db_host = 'localhost';
$db_user = 'username';
$db_pass = 'password';
$db_name = 'database_name';
$tables_to_export = ['table1', 'table2']; // 要导出的表名数组
$output_file = 'data_export_' . date('Ymd_His') . '.sql';

try {
    // 创建 PDO 连接
    $conn = new PDO("mysql:host=$db_host;dbname=$db_name", $db_user, $db_pass);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    // 设置 UTF-8 编码
    $conn->exec("SET NAMES utf8");
    
    // SQL 文件头部信息
    $sql_content = "-- MySQL 数据导出\n";
    $sql_content .= "-- 生成时间: " . date('Y-m-d H:i:s') . "\n";
    $sql_content .= "-- 注意: 此文件包含 TRUNCATE 语句,导入前将清空目标表\n\n";
    $sql_content .= "SET FOREIGN_KEY_CHECKS = 0;\n\n";
    
    // 循环处理每个表
    foreach ($tables_to_export as $table_name) {
        // 1. 添加清空表语句
        $sql_content .= "--\n-- 清空表 `$table_name`\n--\n";
        $sql_content .= "TRUNCATE TABLE `$table_name`;\n\n";
        
        // 2. 导出表数据
        $sql_content .= "--\n-- 导出表 `$table_name` 的数据\n--\n\n";
        
        // 获取所有数据
        $stmt = $conn->query("SELECT * FROM `$table_name`");
        $stmt->setFetchMode(PDO::FETCH_ASSOC);
        
        // 获取列名
        $column_count = $stmt->columnCount();
        $columns = [];
        for ($i = 0; $i < $column_count; $i++) {
            $meta = $stmt->getColumnMeta($i);
            $columns[] = $meta['name'];
        }
        
        // 生成 INSERT 语句
        $row_count = 0;
        while ($row = $stmt->fetch()) {
            $values = [];
            foreach ($row as $value) {
                if (is_null($value)) {
                    $values[] = 'NULL';
                } else {
                    $values[] = $conn->quote($value);
                }
            }
            
            $sql_content .= "INSERT INTO `$table_name` (`" . implode('`,`', $columns) . "`) VALUES (" . implode(',', $values) . ");\n";
            $row_count++;
        }
        
        $sql_content .= "-- 共导出 {$row_count} 行数据\n\n";
    }
    
    $sql_content .= "SET FOREIGN_KEY_CHECKS = 1;\n";
    $sql_content .= "-- 数据导出完成\n";
    
    // 写入文件未压缩的.sql文件
    file_put_contents($output_file, $sql_content);
	/* gzip压缩
	$gzip_file = 'data_export_' . date('Ymd_His') . '.sql.gz';
	$data = $sql_content;
	// 使用 gzencode 压缩
	$compressed = gzencode($data, 9); // 9 是最高压缩级别
	file_put_contents('./data/'.$gzip_file, $compressed);
	*/
    
    echo "数据导出成功!文件已保存为: " . $output_file;

} catch(PDOException $e) {
    echo "导出失败: " . $e->getMessage();
}
?>

功能特点

  1. 清空表数据

    • 使用 TRUNCATE TABLE 语句(比 DELETE 更高效)

    • 在每条 INSERT 语句前先清空目标表

  2. 数据导出

    • 自动处理 NULL 值

    • 使用 PDO::quote() 正确转义特殊字符

    • 保持原始数据类型

  3. 实用功能

    • 显示导出的行数统计

    • 临时禁用外键约束确保顺利导入

    • 文件头部包含有用的注释信息

使用方法

  1. 修改数据库连接参数

  2. 在 $tables_to_export 数组中指定要导出的表

  3. 运行脚本生成 SQL 文件

  4. 导出的文件可以直接用 MySQL 客户端执行导入

注意事项

  1. TRUNCATE 会重置自增列,如果需要保留自增ID,可以改为 DELETE FROM table

  2. 对于大表,建议分批导出或添加分页处理

  3. 确保 PHP 有写入文件的权限

  4. 外键约束会在导入完成后恢复