我知道可以单独执行alter table语句将表的存储引擎从MyISAM更改为InnoDB。
我想知道是否有一种快速将所有表更改为InnoDB的方法?
在MySQL客户端、phpMyAdmin或其他地方运行此SQL语句,以检索数据库中的所有MyISAM表。
将name_of_your_db
变量的值替换为您的数据库名称。
SET @DATABASE_NAME = 'name_of_your_db';
SELECT CONCAT('ALTER TABLE `', table_name, '` ENGINE=InnoDB;') AS sql_statements
FROM information_schema.tables AS tb
WHERE table_schema = @DATABASE_NAME
AND `ENGINE` = 'MyISAM'
AND `TABLE_TYPE` = 'BASE TABLE'
ORDER BY table_name DESC;
然后,复制输出并作为新的 SQL 查询运行。
ORDER BY table_name DESC
) - rinogoSELECT CONCAT('ALTER TABLE \
', table_schema, '`.`', table_name, '` ENGINE=InnoDB;') AS sql_statements FROM information_schema.tables WHERE table_schema NOT IN ('information_schema', 'performance_schema', 'mysql') AND engine = 'MyISAM' AND table_type = 'BASE TABLE' ORDER BY table_schema,table_name` - dr fu manchu<?php
// connect your database here first
//
// Actual code starts here
$sql = "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'your_database_name'
AND ENGINE = 'MyISAM'";
$rs = mysql_query($sql);
while($row = mysql_fetch_array($rs))
{
$tbl = $row[0];
$sql = "ALTER TABLE `$tbl` ENGINE=INNODB";
mysql_query($sql);
}
?>
mysql_*
接口已被弃用并在7版本中移除。不要直接使用此代码。 - Rick JamesSELECT CONCAT('ALTER TABLE ',TABLE_NAME,' ENGINE=InnoDB;')
FROM INFORMATION_SCHEMA.TABLES
WHERE ENGINE='MyISAM'
AND table_schema = 'mydatabase';
运行得非常好。
这将为您提供所有表的列表,以及您可以批量运行的修改查询。
一行:
mysql -u root -p dbName -e
"show table status where Engine='MyISAM';" | awk
'NR>1 {print "ALTER TABLE "$1" ENGINE = InnoDB;"}' |
mysql -u root -p dbName
"$1"
用反引号括起来,就像我的答案中所示的那样:\
"$1"``。 - Vijay Varadanecho 'SHOW TABLES;' \
| mysql -u <username> --password=<password> -D <schema> \
| awk '!/^Tables_in_/ {print "ALTER TABLE `"$0"` ENGINE = InnoDB;"}' \
| column -t \
要执行此更改,只需使用以下命令:
echo 'SHOW TABLES;' \
| mysql -u <username> --password=<password> -D <schema> \
| awk '!/^Tables_in_/ {print "ALTER TABLE `"$0"` ENGINE = InnoDB;"}' \
| column -t \
| mysql -u <username> --password=<password> -D <schema>
版权归属:这是此文章中概述的变体。
在phpMyAdmin中将其作为SQL查询使用
SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' engine=InnoDB;')
FROM information_schema.tables
WHERE engine = 'MyISAM';
SELECT CONCAT('ALTER TABLE `',table_schema,'`.`',table_name,'` engine=InnoDB;') FROM information_schema.tables WHERE engine = 'MyISAM' and table_schema not in ('information_schema','mysql','performance_schema','sys');
- Marty Sama你可以在mysql命令行工具中执行以下语句:
echo "SELECT concat('ALTER TABLE `',TABLE_NAME,'` ENGINE=InnoDB;')
FROM Information_schema.TABLES
WHERE ENGINE != 'InnoDB' AND TABLE_TYPE='BASE TABLE'
AND TABLE_SCHEMA='name-of-database'" | mysql > convert.sql
您可能需要使用以下命令来指定用户名和密码:mysql -u用户名 -p。 结果是一个 SQL 脚本,您可以将其传回 MySQL:
mysql name-of-database < convert.sql
在上述语句和命令行中替换"name-of-database"。
非常简单,只有两个步骤。
复制、粘贴并运行以下代码:
SET @DATABASE_NAME = 'name_of_your_db';
SELECT CONCAT('ALTER TABLE `', table_name, '` ENGINE=InnoDB;') AS sql_statements FROM information_schema.tables AS tb WHERE table_schema = @DATABASE_NAME AND `ENGINE` = 'MyISAM' AND `TABLE_TYPE` = 'BASE TABLE' ORDER BY table_name DESC;
(将所有结果复制并粘贴到SQL选项卡中,然后在下面的行中粘贴。)
START TRANSACTION;
COMMIT;
例如:
START TRANSACTION;
ALTER TABLE `admin_files` ENGINE=InnoDB;
COMMIT;
要为所有非系统模式中的所有表生成ALTER语句,并按这些模式/表的顺序运行以下命令:
SELECT CONCAT('ALTER TABLE ',TABLE_SCHEMA,'.', table_name, ' ENGINE=InnoDB;') AS sql_statements
FROM information_schema.tables
WHERE TABLE_SCHEMA NOT IN ('mysql', 'information_schema', 'performance_schema', 'innodb', 'sys', 'tmp')
AND `ENGINE` = 'MyISAM'
AND `TABLE_TYPE` = 'BASE TABLE'
ORDER BY TABLE_SCHEMA, table_name DESC;
之后,通过客户端运行这些查询以执行更改。
还没有提到,所以我会为后人写下:
如果您正在迁移数据库服务器(或有其他原因需要转储和重新加载数据),您可以修改 mysqldump
的输出:
mysqldump --no-data DBNAME | sed 's/ENGINE=MyISAM/ENGINE=InnoDB/' > my_schema.sql;
mysqldump --no-create-info DBNAME > my_data.sql;
然后再次加载它:
mysql DBNAME < my_schema.sql && mysql DBNAME < my_data.sql