数据库布尔型状态字段互斥性的SQL更新操作
一个配置表或者一个存储了多条状态的表,需要在某个状态中做切换,而当前是否启用状态标记是用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更新操作的更多相关文章
- 在myeclipse中配置DB Driver(数据库用MySql),并在myeclipse执行sql语句操作
在myeclipse中配置DB Driver(数据库用MySql),并在myeclipse执行sql语句操作 MyEclipse6.5 , mysq驱动jar包为mysql-connector ...
- 统计mysql数据库中数据表/字段等数量的sql
1.查询一个表中有多少个字段: SELECT COUNT(*) FROM information_schema. COLUMNSWHERE table_schema = '数据库名'AND table ...
- 2016/3/24 ①数据库与php连接 三种输出fetch_row()、fetch_all()、fetch_assoc() ②增删改时判断(布尔型) ③表与表之间的联动 ④下拉菜单 ⑤登陆 三个页面
①数据库与php连接 图表 header("content-type:text/html;charset=utf-8"); //第一种方式: //1,生成连接,连接到数据库上的 ...
- Sqli-LABS通关笔录-5[SQL布尔型盲注]
/* 请为原作者打个标记.出自:珍惜少年时 */ 通过该关卡的学习我掌握到了 1.如何灵活的运用mysql里的MID.ASCII.length.等函数 2.布尔型盲注的认识 3.哦,对了还有.程序 ...
- MySQL数据库中tinyint类型字段读取数据为true和false
今天遇到这么一个问题,公司最近在做一个活动,然后数据库需要建表,其中有个字段是关于奖励发放的状态的字段,结果读取出来的值为true 一.解决读取数据为true/false的问题 场景: 字段:stat ...
- mybatis取数据库为null的字段
数据库中存在int型的字段,但是初始值为null,mybatis取值之后就会报错, org.apache.ibatis.binding.BindingException: Mapper method ...
- 项目之初的模型设计与status状态字段
0X01 开始做一个app的时候,要先做的是流程设计与数据库模型设计. 但做的模型设计往往是设置字段满足当前的需求,缺乏足够的经验,即使为以后的功能预留出位置,也无法考虑周全. 比如,刚开始做用户表, ...
- MySQL数据库中tinyint类型字段读取数据为true和false (MySQL的boolean和tinyint(1))
数据库一个表中有一个tinyint类型的字段,值为0或者1,如果取出来的话,0会变成false,1会变成true. MySQL保存boolean值时用1代表TRUE,0代表FALSE.boolean在 ...
- python 数据类型---布尔型& 字符串
python数据类型-----布尔型 真或假=>1或0 >>> 1==True True >>> 0==False True python 数据类型----- ...
随机推荐
- maven常用的一些依赖
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit ...
- Python sql注入 过滤字符串的非法字符
#coding:utf8 #在开发过程中,要对前端传过来的数据进行验证,防止sql注入攻击,其中的一个方案就是过滤用户传过来的非法的字符 def sql_filter(sql, max_length= ...
- Strategy Execution with Strategy Maps and balanced score cards
4 barriers for strategy execution: - vision barrier - people barrier - resource barrier - management ...
- Xilinx-7Series-FPGA高速收发器使用学习—RX接收端介绍
上一篇博文介绍了GTX的发送端,这一篇将介绍GTX的RX接收端,GTX RX接收端的结构和TX发送端类似,数据流方向相反,不过和发送端也有一些区别,GTX的RX接收端结构图如图1所示: 图1 下面将根 ...
- linux性能不好怎么办?对着清单撸一遍
性能不好怎么办?对着清单撸一遍 Brendan Gregg是Netflix的资深性能架构师,著名性能调优专家.著有<性能之巅:洞悉系统.企业与云计算>)一书,可以说是性能调优领域的集大成之 ...
- win32环境下显示中文
//编码转换 //#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) // string title = "成绩"; // GBK2UTF8 ...
- Python删除列表中元素
Python中列表(list)是很常用的数据结构,删除列表中的元素有几种方法 列表的remove方法 lst = [1, 1, 3, 4] lst.remove(1) # lst->[1, 3, ...
- Python 切片那些事
- XML异步请求实例
其实还是很格式化的: <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type&qu ...
- 常用vim编辑器命令行
按ESC键 跳到命令模式,然后: :w 保存文件但不退出vi:w file 将修改另外保存到file中,不退出vi:w! 强制保存,不推出vi:wq 保存文件并退出vi:wq! 强制保存文件,并退出v ...