Mysql 批量 改 表 引擎

     这篇文章与前面写的”Spring事务控制”是有冲突的,前面我提到验证了数据库表引擎即使是MyISAM事务控制依然正常,但是今天正式系统出现的事务控制失败,将库表引擎改为InnoDB后事务控制成功,这又恰恰反驳了我之前的验证(看来还不能盖棺定论,前面的验证还得重来)。

    现在说怎么实现“批量”更新库表引擎。

    如果是单个表,我们可以通过 ALTER  TABLE TABLENAME ENGINE = InnoDB;来实现修改。

    改整个库的话就要批量更新,网上提供的脚本好复杂,而且还需要重复刷脚本。我这里偷懒了,换了种批量修改的方式,看以下代码。

 

package com.修改数据库引擎;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import com.jdbc.JDBCFactory;

/**
 * 修改库表引擎
 * @author Administrator
 * 这里的思想很简单,就是获取数据库所有表的表名并存在数组里。然后遍历数据打印输出
 * 修改每一个表引擎的sql
 */
public class 修改库表引擎 {
    //存储表名
    public static String[] tablenames=null;
   
    //静态块,程序运行时首先初始化tablenames
    static {
        Connection con = JDBCFactory.getCon();
        Statement stmt;
        try {
            stmt = con.createStatement();
            //查出所有表名
            ResultSet rst = stmt.executeQuery("SHOW TABLES");
            List<String> tables=new ArrayList<String>();
            while(rst.next())
            {
                tables.add(rst.getString(1));
            }
            tablenames=tables.toArray(new String[]{});
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
   
    /**
     * 主函数
     * @param args
     */
    public static void main(String[] args) {
        for (int i = 0; i < tablenames.length; i++) {
            //遍历输出修改引擎sql
            System.out.println("ALTER  TABLE "+tablenames[i]+" ENGINE = InnoDB;");;
        }
    }
}

 

 

将控制台打印出来的结果Copy执行就OK啦。

### MySQL 批量更新数据的方法 在 MySQL 中,可以通过多种方式实现批量更新数据的功能。以下是几种常见的方法及其示例: #### 方法一:`ON DUPLICATE KEY UPDATE` 当插入的数据违反唯一约束(如主键或唯一索引)时,可以使用 `ON DUPLICATE KEY UPDATE` 语法来实现更新操作。这种方法适用于需要同时处理插入和更新的情况。 ```sql INSERT INTO table_name (column1, column2, column3) VALUES (value1_1, value1_2, value1_3), (value2_1, value2_2, value2_3), ... ON DUPLICATE KEY UPDATE column2 = VALUES(column2), column3 = VALUES(column3); ``` 上述语句中,如果某一行记录已经存在,则会触发 `ON DUPLICATE KEY UPDATE` 子句中的逻辑,按照指定的方式更新列值[^1]。 --- #### 方法二:通过临时进行批量更新 对于大规模数据的更新场景,可以借助临时完成高效的操作。具体流程如下: 1. 创建一个临时; 2. 将待更新的数据导入到该临时中; 3. 使用 SQL 的 JOIN 或子查询机制将目标与临时关联起来,并执行更新操作。 示例代码如下: ```sql -- 步骤 1: 创建临时 CREATE TEMPORARY TABLE temp_table ( id INT PRIMARY KEY, new_value VARCHAR(255) ); -- 步骤 2: 插入待更新的数据至临时 INSERT INTO temp_table (id, new_value) VALUES (1, 'new_data_1'), (2, 'new_data_2'); -- 步骤 3: 更新原中的数据 UPDATE original_table o JOIN temp_table t ON o.id = t.id SET o.column_to_update = t.new_value; ``` 此方法适合于涉及大量数据更新的情形,能够显著提升性能[^4]。 --- #### 方法三:利用多行 SET 实现单条更新语句 另一种简单直观的做法是在一条 `UPDATE` 语句中定义多个条件分支,从而一次性完成多行数据的更新工作。 ```sql UPDATE table_name SET column1 = CASE id WHEN 1 THEN 'value_for_id_1' WHEN 2 THEN 'value_for_id_2' END, column2 = CASE id WHEN 1 THEN 'another_value_for_id_1' WHEN 2 THEN 'another_value_for_id_2' END WHERE id IN (1, 2); ``` 以上例子展示了如何针对特定 ID 设置不同的新值。 --- #### 方法四:分批提交以优化大容量更新 为了防止因事务过大而导致锁定时间过长或者内存溢出等问题,在实际应用过程中还可以考虑采用分批次的方式来逐步完成整个任务。例如 MyBatis-Plus 框架内部正是采用了类似的策略,默认情况下每 1000 行作为一组单独提交给数据库引擎去处理[^2]。 示例伪代码展示如下: ```java int batchSize = 1000; List<YourEntity> entitiesToUpdate = fetchEntitiesToBeUpdated(); try (PreparedStatement pstmt = connection.prepareStatement(updateSql)) { for (YourEntity entity : entitiesToUpdate) { setParameters(pstmt, entity); // 绑定参数 pstmt.addBatch(); // 添加到批处理队列 if (++count % batchSize == 0 || count == entitiesToUpdate.size()) { pstmt.executeBatch(); // 达到阈值即刻执行当前积累的所有变更请求 pstmt.clearBatch(); // 清空缓存以便继续累积后续指令集 } } } ``` --- ### 总结 综上所述,MySQL 提供了灵活丰富的手段支持开发者们根据不同业务需求选择合适的方案来进行高效的批量数据修改作业。无论是基础层面还是高级技巧都有相应的解决方案可供采纳实施。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值