现代开发中,除非你的项目中只有或者绝大部分的需求都是 select 查询时,可以考虑使用 MyISAM 引擎。否则一律推荐使用 InnoDB 引擎。
而我最近接手的一个项目中需要用到大量的事务操作确保数据一致性,而很多数据表的引擎是 MyISAM,导致事务不生效,因此想着将 MyISAM 引擎的数据表批量修改为 InnoDB 引擎。下面讲解一下批量修改 MySQL 数据表为 InnoDB 引擎的详细方法。
1.生成 ALTER TABLE 语句:
连接到你的 MySQL/MariaDB 数据库。你可以使用命令行工具 (mysql) 或者图形化工具 (如 phpMyAdmin, Sequel Pro, TablePlus, DBeaver 等)。 执行以下 SQL 查询,它会为你的数据库中所有 非 InnoDB 的表生成相应的 ALTER TABLE 语句:
SELECT CONCAT('ALTER TABLE `', table_schema, '`.`', table_name, '` ENGINE=InnoDB;')
FROM information_schema.TABLES
WHERE table_schema = 'your_db' -- <--- 将 'your_db' 替换为你的实际数据库名
AND engine != 'InnoDB'; -- 只选择非 InnoDB 的表
- 注意: 将
'your_laravel_db'替换为你在步骤 1 中找到的实际数据库名称。 - 如果你想强制更改 所有 表(包括已经是 InnoDB 的,虽然没必要但无害),可以去掉
AND engine != 'InnoDB'这个条件。
我这里使用的是 Navicat Premium 16 软件,运行完批量生成的 SQL 语句如下图:

ALTER TABLE `www.02405.com`.`cache_locks` ENGINE=InnoDB;
ALTER TABLE `www.02405.com`.`company_profiles` ENGINE=InnoDB;
ALTER TABLE `www.02405.com`.`exhibitor_profiles` ENGINE=InnoDB;
ALTER TABLE `www.02405.com`.`failed_jobs` ENGINE=InnoDB;
ALTER TABLE `www.02405.com`.`individual_profiles` ENGINE=InnoDB;
ALTER TABLE `www.02405.com`.`job_batches` ENGINE=InnoDB;
ALTER TABLE `www.02405.com`.`jobs` ENGINE=InnoDB;
ALTER TABLE `www.02405.com`.`migrations` ENGINE=InnoDB;
ALTER TABLE `www.02405.com`.`model_has_permissions` ENGINE=InnoDB;
ALTER TABLE `www.02405.com`.`model_has_roles` ENGINE=InnoDB;
ALTER TABLE `www.02405.com`.`password_reset_tokens` ENGINE=InnoDB;
ALTER TABLE `www.02405.com`.`permissions` ENGINE=InnoDB;
ALTER TABLE `www.02405.com`.`role_has_permissions` ENGINE=InnoDB;
ALTER TABLE `www.02405.com`.`roles` ENGINE=InnoDB;
ALTER TABLE `www.02405.com`.`sessions` ENGINE=InnoDB;
ALTER TABLE `www.02405.com`.`users` ENGINE=InnoDB;
2.执行生成的语句:
- 命令行: 将上一步查询结果复制出来(每一行都是一个
ALTER TABLE ...;语句)。将这些语句粘贴到mysql命令行客户端中执行。 - 图形化工具: 在 SQL 编辑器中执行上一步的查询,然后复制查询结果(即所有
ALTER TABLE语句),再将这些语句粘贴到 SQL 编辑器中一次性执行。
执行后,就会批量将数据表改为 InnoDB 引擎了。
推荐阅读:#1031 – Table storage engine for ‘xxx’ doesn’t have this option 的解决办法
相关推荐:



