ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

我可以在一个查询中重命名MySQL ENUM列中的值吗?

2019-08-05 13:26:17  阅读:247  来源: 互联网

标签:mysql alter-table


假设我有一个带有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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有