一个配置表或者一个存储了多条状态的表,需要在某个状态中做切换,而当前是否启用状态标记是用0和1来标识的。这个时候通常 1表示正在使用中,0表示不在使用中。通常有些业务会做一些配置的状态切换,就会出现要求0变1 1变0的情况,从某个状态的不再使用 到另一个状态的启用,就带来了数学上的互斥性,这样的情况一般出现在这种状态之间的存在是平行的,只能选择一种,是互斥性事件。比如中学中学到的,一个白球一个红球,两个球二选一,就会出现选择红球还是白球的情况,而选择结果必然是红球或者白球中的一个,那么另外一个是必然选不上的,我们称之为互斥。百度上的解释为:

事件A和B的交集为空,A与B就是互斥事件,也叫互不相容事件。也可叙述为:不可能同时发生的事件。如A∩B为不可能事件(A∩B=Φ),那么称事件A与事件B互斥,其含义是:事件A与事件B在任何一次试验中不会同时发生

在这样的设计下,违反了第三范式,应该拆分表为一个状态明细的基础表,一个选择了的启用状态的记录表,然而我们的数据库设计中不可能总是达到第三范式,这样的设计给我们的查询带来了比较大的难度,需要有两次join才可以

比如我们举一个简单的例子,当前游戏的兵器配置表中 系统启用了某一种兵器作为默认兵器,(游戏途中是可以切换的 系统有多种兵器) 现在状态如下

该系统现在设置方天画戟为默认武器,如果在配置中想把兵器默认配置为 如意金箍棒,在以往我们的认知中 需要两条SQL

如此可完成将兵器配置从方天画戟切换到如意金箍棒。

我们可以看到 采用两条SQL进行更新,可以达到效果。根据互斥原理,必须全部更新但是保留新数据的状态,才能将启用的信息从id=3切换到id=4

改进的SQL如下

采用if语句完成更新状态的切换。优点是合并SQL,缺点是采用了if函数,降低可读性和效率了,当然开发者可以根据自己项目所处条件和环境来决定如何处理。

在上述问题只有两种状态可以切换的时候,就出现了AB两个事件的互斥事件,这个时候,还有其他的办法来解决上述问题。比如

魔法的使用情况 使用 放弃 两种互斥事件产生,分别采用了两行记录来存储(而且必须是两行记录 思考一下为什么,为何不用一个列字段来存储呢?挖坑在此,请自己思考),而切换状态的时候,必然是一个启用 ,一个不启用,那么这个时候又该如何高效的处理呢?当然还是可以采用最基本的办法两条SQL处理,效果如下

或者是我上面那种if方法来处理,当然我们还有其他办法,在思考这个问题的时候,我们注意观察到 状态形成互斥0 和1 ,不正是数据类型中的布尔型吗?那么布尔型的转换如何让0变1 1变0呢?小学的数学公式告诉我们,加数与加数之间的互换可以有和来解决,所以0和1之间的切换可以有0+1=1的和1来解决,所以SQL如下:

即解决了状态的启用在两种互斥状态中的切换!

数据库布尔型状态字段互斥性的SQL更新操作的更多相关文章

  1. 在myeclipse中配置DB Driver(数据库用MySql),并在myeclipse执行sql语句操作

    在myeclipse中配置DB Driver(数据库用MySql),并在myeclipse执行sql语句操作 MyEclipse6.5    ,  mysq驱动jar包为mysql-connector ...

  2. 统计mysql数据库中数据表/字段等数量的sql

    1.查询一个表中有多少个字段: SELECT COUNT(*) FROM information_schema. COLUMNSWHERE table_schema = '数据库名'AND table ...

  3. 2016/3/24 ①数据库与php连接 三种输出fetch_row()、fetch_all()、fetch_assoc() ②增删改时判断(布尔型) ③表与表之间的联动 ④下拉菜单 ⑤登陆 三个页面

    ①数据库与php连接   图表 header("content-type:text/html;charset=utf-8"); //第一种方式: //1,生成连接,连接到数据库上的 ...

  4. Sqli-LABS通关笔录-5[SQL布尔型盲注]

    /* 请为原作者打个标记.出自:珍惜少年时 */   通过该关卡的学习我掌握到了 1.如何灵活的运用mysql里的MID.ASCII.length.等函数 2.布尔型盲注的认识 3.哦,对了还有.程序 ...

  5. MySQL数据库中tinyint类型字段读取数据为true和false

    今天遇到这么一个问题,公司最近在做一个活动,然后数据库需要建表,其中有个字段是关于奖励发放的状态的字段,结果读取出来的值为true 一.解决读取数据为true/false的问题 场景: 字段:stat ...

  6. mybatis取数据库为null的字段

    数据库中存在int型的字段,但是初始值为null,mybatis取值之后就会报错, org.apache.ibatis.binding.BindingException: Mapper method ...

  7. 项目之初的模型设计与status状态字段

    0X01 开始做一个app的时候,要先做的是流程设计与数据库模型设计. 但做的模型设计往往是设置字段满足当前的需求,缺乏足够的经验,即使为以后的功能预留出位置,也无法考虑周全. 比如,刚开始做用户表, ...

  8. MySQL数据库中tinyint类型字段读取数据为true和false (MySQL的boolean和tinyint(1))

    数据库一个表中有一个tinyint类型的字段,值为0或者1,如果取出来的话,0会变成false,1会变成true. MySQL保存boolean值时用1代表TRUE,0代表FALSE.boolean在 ...

  9. python 数据类型---布尔型& 字符串

    python数据类型-----布尔型 真或假=>1或0 >>> 1==True True >>> 0==False True python 数据类型----- ...

随机推荐

  1. ThinkPHP实现事务回滚示例代码(附加:PDO的事务处理)

    ThinkPHP的事务回滚示例如下: $m=D('YourModel');//或者是M(); $m2=D('YouModel2'); $m->startTrans();//在第一个模型里启用就可 ...

  2. jquery 入门与知识

    一)什么是jQuery? [以封装的思想,重构<<图片显示和隐藏>>] 第三方组织预先写好的一些实用JS文件.类,方法,都统称为JS实用库,免费放在网上,同时配有相关的学习文档 ...

  3. postgresql一般crud存储过程参考[转]

    http://blog.csdn.net/cdnight/article/details/18082255 这里是一份经过再三调试测试而成功的postgres数据库单表crud存储过程,请注意,对于多 ...

  4. linux下利用shell脚本和mysqldump热备份和恢复mysql

    对mifeng数据库进行每周六3:33完全热备份,并可以完全恢复! 一.先建立备份脚本 #vi /mifengbackup/backup.sh #!bin/bash cd /mifengbackup ...

  5. ZOJ Problem Set - 2297 Survival 【状压dp】

    题目:ZOJ Problem Set - 2297 Survival 题意:给出一些怪,有两个值,打他花费的血和能够添加的血,然后有一个boss,必须把小怪全部都打死之后才干打boss,血量小于0会死 ...

  6. U盘 格式化 ext3 ext4

    [root@ok Desktop]# mkfs.ext3 /dev/sdc mke2fs 1.41.12 (17-May-2010) /dev/sdc is entire device, not ju ...

  7. 管道相关函数(1)-pipe

    定义: int pipe(int filedes[2]); 表头文件: #include<unistd.h> 说明: pipe()会建立管道, 并将文件描述词由参数filedes数组返回. ...

  8. CGameMainScene类

    #ifndef __GAMEMAIN_SCENE_H__ #define __GAMEMAIN_SCENE_H__ #include "cocos2d.h" #include &q ...

  9. spark源代码

    电子书: https://spark-internals.books.yourtion.com/

  10. jquery 获取字符串中的数字

    str_num = 'abc123' num = parseInt(str_num.replace(/[^0-9]/ig,"")); alert(num);