一个配置表或者一个存储了多条状态的表,需要在某个状态中做切换,而当前是否启用状态标记是用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. 创建你的第一个Android PHP应用

    google的开源移动操作系统Android给智能手机市场带来了风暴.不像Apple,对想要为水果市场(Iphone App Store)提供应用软件的开发者们有着严格的指导原则以及要求,Google ...

  2. Python translate()方法

    描述 Python translate() 方法根据 maketrans() 方法给出的字符映射转换表转换字符串中的字符. 语法 translate() 方法语法: Python3中: S.trans ...

  3. Mockito 相关资料

    https://monkeyisland.pl/2008/04/26/asking-and-telling/ http://qiuguo0205.iteye.com/blog/1456528 http ...

  4. atitit..主流 浏览器 js 引擎 内核 市场份额 attialx总结vOa9

    atitit..主流 浏览器 js 引擎  内核 市场份额 attialx总结vOa9 1. 浏览器内核 1 2. 浏览器的主要组件包括: 2 2.1. 主要组件体系结构 2 2.2. WebCore ...

  5. 【Android】15.4 例15-2--Notification基本用法

    分类:C#.Android.VS2015: 创建日期:2016-02-29 一.简介 上一节介绍了通知(Notification)相关的基本内容.这一节先用一个简单示例演示创建和发布本地通知的基本用法 ...

  6. How to Install Xcode, Homebrew, Git, RVM, Ruby & Rails on Snow Leopard, Lion, Mountain Lion, and Mavericks

    After following many outdated and incomplete instructions for setting up a web development environme ...

  7. iOS图片上传1

    这几天在搞iphone上面一个应用的开发,里面有需要摄像头/相册编程和图片上传的问题,在这里总结一下. [部分知识] iphone中图像通常存储在4个地方[相册.应用程序包.沙盒.Internet], ...

  8. Hystrix的用法demo

    1.引入依赖 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId> ...

  9. 在linux下监控文件是否被删除或创建的命令

    You can use auditd and add a rule for that file to be watched: auditctl -w /path/to/that/file -p wa ...

  10. jquery 修改 bootstrap模态框的宽度并且居中

    1.定义模态框 <div class="modal fade" id="Project_Cell_Modal" tabindex="-1&quo ...