数据库
首页 > 数据库> > 我可以在一个查询中重命名MySQL ENUM列中的值吗?

我可以在一个查询中重命名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