切换数据库mysql中的所有二进制值

Posted

技术标签:

【中文标题】切换数据库mysql中的所有二进制值【英文标题】:switch all binary values in database mysql 【发布时间】:2014-05-12 22:04:55 【问题描述】:

我的任务是为具有相对较大的 mysql 数据库(不是那么大但太大而无法手动完成)的网站进行“2.0”重写。

我目前正在经历重新组织和规范化数据库的过程,这是在没有太多计划的情况下即时构思的。

一个更明显的问题是,由于某种原因,数据库中的所有二进制值都被切换到所有 50 个表中 0 为真,1 为假的位置。我觉得这是未来数据和代码中的错误和混乱的秘诀。

有什么方法可以通过 sql / phpmyadmin 跨数据库将其改回正常状态?

【问题讨论】:

有这个“问题”的列数是否有限?并且所有列(微小)都是 int 吗? 大约有 60-70 列可以做到这一点。它们都是 tinyint。 【参考方案1】:

按位异或^:

UPDATE table_name SET column_name = (column_name ^ 1)

【讨论】:

嗨!这很好用,但我不确定发生了什么。你介意再解释一下吗? @synapseradio 他正在使用按位运算符(php.net/manual/en/language.operators.bitwise.php)。但你也可以做一些其他有趣的数学。例如column_name = (column_name-1)*-1。或column_name = pow(0,column_name)【参考方案2】:

如果存在此问题的列数有限,并且所有这些列都是数字或文本且仅包含值 0 或 1,则可以执行此 PER 存在问题的列:

update myTable set myColumn = '2' where myColumn = '1';
update myTable set myColumn = '1' where myColumn = '0';
update myTable set myColumn = '0' where myColumn = '2';

如果列是枚举,您将需要另一种方法。 (一个很好的解决方法是使用null 或空字符串而不是2,但只有当该列不为空时才能这样做。)

编辑

可以做得更简单,列的类型是什么都无所谓。

如果你不期望空值:

update myTable set myColumn = if(myColumn='1','0','1');

如果空值应该保持空值:

update myTable set myColumn = if(myColumn is null, null, if(myColumn='1','0','1'));

如果空值应该变成 1:

update myTable set myColumn = if(myColumn is null, '1', if(myColumn='1','0','1'));

【讨论】:

谢谢谢谢!第二个效果很好,而且足够简洁,做 70 次不会花我太长时间。

以上是关于切换数据库mysql中的所有二进制值的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI - 如何切换核心数据中的所有布尔值

数据库MMM故障转移切换

(5.9)mysql高可用系列——正常主从切换测试

动态读取离子切换值并发布到数据库

MySQL数据库高可用MHA故障切换

LAMP架构之9——MySQL高可用切换(MHA)