一个配置表或者一个存储了多条状态的表,需要在某个状态中做切换,而当前是否启用状态标记是用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. jquery prop('checked', true)解决attr('checked', true)不能选中radio问题

    正如标题所言,使用:prop('checked', true)就可以了

  2. Android开发之帐户管理

    android.accounts主要包括了集中式的帐户管理API, AccountManagerCallback, AccountManagerFuture, OnAccountsUpdateList ...

  3. 用PL/pgSQL写postgreSQL的存储过程[转]

    http://blog.chinaunix.net/uid-7591044-id-1742967.html 今天学会了用 PL/pgSQL 写 postgreSQL 的存储过程,网上资料实在少得可怜, ...

  4. SQL Prompt几个快捷键

    推荐一个小插件,SQL Prompt,配合Microsoft SQL Server Management Studio,使用起来非常方便,同时再加上以下几个快捷键: (1)ctrl+5或F5,运行代码 ...

  5. unity, switch platform

    例如一开始是iPhone, iPod Touch and iPad,如图: 想切换成PC, Mac & Linux Standalone,如图: 方法是File->Build Setti ...

  6. 366. Fibonacci【Naive】

    Find the Nth number in Fibonacci sequence. A Fibonacci sequence is defined as follow: The first two ...

  7. Django And Django-Rest-Framework 异常记录

    1.TypeError: init() takes 1 positional argument but 2 were given

  8. 在容器中使用erase函数,迭代器的处理

    在c++编程中,用到迭代器的时候,往往不知道如何删除当前迭代器指向的元素. erase函数:   返回下一个迭代器. 只使用vector的erase函数,记住,该函数是迭代器失效,返回下一个迭代器. ...

  9. excel鼠标拖选慢shift选择快的问题

    今天遇到个惊天大坑,关于excel的,最近,一直在调查这个东西,刚开始真的是毫无头绪,反正现在就是excel的值的copy会偶尔慢,慢的情况也是不明白,就是稀里糊涂的调查. 刚开始连100%再现这个b ...

  10. Ubuntu 下添加OpenERP command 快捷启动方式

    编辑home目录下的.bashrc文件 alias xjerp="~/odoo/xj/openerp-server -r openerp --addons-path='~/odoo/xj/o ...