我可以在一个查询中重命名MySQL ENUM列中的值吗?
作者:互联网
假设我有一个带有ENUM的数据库表(‘value_one’,’value_two’).
我想将其更改为ENUM(‘第一个值’,’第二个值’).我目前这样做如下:
ALTER TABLE `table` MODIFY `column` ENUM('value_one','value_two','First value','Second value');
UPDATE `table` SET `column`='First Value' WHERE `column`='value_one';
UPDATE `table` SET `column`='Second Value' WHERE `column`='value_two';
ALTER TABLE `table` MODIFY `column` ENUM('First value','Second value');
有没有更有效的方法来做到这一点,E.G.使用单个ALTER TABLE语句实现此目的的方法?
解决方法:
我要向你展示的下列技术将需要钢铁.
鉴于以下标准
> datadir是/ var / lib / mysql
>表是mydb.mytb
>调用的enum列称为enum_col
>引擎是MyISAM
这是一个致命的裂缝:
> CREATE TABLE mydb.mybt LIKE mydb.mytb;
> ALTER TABLE mydb.mybt MODIFY enum_col ENUM(‘First value’,’Second value’);
> SET wait_timeout = 86400; SET interactive_timeout = 86400;
>带读锁的冲洗表;
>在单独的OS / SSH会话中,交换.frm文件
> $mv /var/lib/mysql/mydb/mytb.frm /var/lib/mysql/mydb/myxx.frm
> $mv /var/lib/mysql/mydb/mybt.frm /var/lib/mysql/mydb/mytb.frm
> $mv /var/lib/mysql/mydb/myxx.frm /var/lib/mysql/mydb/mybt.frm
>解锁表格;
> DROP TABLE mydb.mybt;
而已 !!!
CAVEAT:我不能为此付出代价!
这项技术来自“High Performance MySQL : Optimization, Backups, Replication, and more”, Pages 146-148在Subheading Speeding Up ALTER TABLE下.第147段第1段说:
The technique we are about to demonstrate is unsupported,
undocumented, and may not work. Use it at your risk. We advise you to
back up you data first!
试试看 ! (请告知我们结果如何)
更新2011-10-05 17:49 EDT
如果表格是MyISAM并且您有足够的空间用于生产和直接停机时间窗口,请尝试以下操作:
>服务mysql restart –skip-networking
>在单独的OS / SSH会话中,制作表的副本
> cp /var/lib/mysql/mydb/mytb.frm /var/lib/mysql/mydb/mytbplay.frm
> cp /var/lib/mysql/mydb/mytb.MYD /var/lib/mysql/mydb/mytbplay.MYD
> cp /var/lib/mysql/mydb/mytb.MYI /var/lib/mysql/mydb/mytbplay.MYI
INFORMATION_SCHEMA.TABLES将自动检测名为mydb.mytbplay的新表的存在.
>在mydb.mytbplay上执行guts-of-steel算法
>您测试mydb.mytbplay的完整性
如果你满意
> ALTER TABLE mydb.mytb RENAME mydb.mytb_backup;
> ALTER TABLE mydb.mytbplay RENAME mydb.mytb;
>服务mysql重启
试试看!
标签:mysql,alter-table 来源: https://codeday.me/bug/20190805/1589230.html