以前比较naive,有次同事一定要在表里建唯一约束的时候,我就很纳闷为啥非要在db层面做限制,在自己的业务代码里做啊,就是说入库的时候先查一遍有没有,没有记录的情况再准许入库。

  后来发现如果只是自己处理业务代码时先查后入库,并发高时会发生意想不到的后果。。

比如现在表tab里有两个字段fa, fb。业务规定,fa和fb的值只能成对出现一次(好比1,2入库一次,就不能再有一条1,2的记录入库)。

当在自己的业务代码里处理避免再次入库时,会这样处理,

步骤一:select 1 from tab where fa = ? and fb = ?

步骤二:insert tab values (?, ?)

那么问题来了(挖掘机哪家强。。):当第一条记录来了,比如fa=1, fb=2。此时他通过了步骤一的检测,没有这条记录,于是来到了步骤二。就在此时,第二条记录又来了,而且又是一个fa=1, fb=2。好吧,第一条记录可能还没入库完呢,那第二条记录也可以通过了步骤一的检测,也来到了步骤二。。而这时,意想不到的事发生了。。有两条一样的记录了。

所以这种并发高了的情况发生就造成这样滴局面。

而如果在数据库层面进行限制就会完美解决这一个问题(当然业务上有上述需求的话,db做了限制外,最好自己的业务代码也要先查一下,再入库。发生了什么好做处理,比如查询的时候发现已经入库了,这时又什么业务策略。再有也可以通过数据库返回码,唯一约束时,db会抛出[Err] 1062的错误码)。。

数据库的约束用法来了。(以下就拿mysql举例。)

w3c讲这一节链接:http://www.w3school.com.cn/sql/sql_unique.asp

一个表可以有多个唯一约束,一个约束可以只有一列,当然也可以有多列。

此时执行这样一条语句(some_name是这个约束名):

ALTER TABLE tab
ADD CONSTRAINT some_name UNIQUE (fa, fb)

如果在第一次建表时,加约束是这样的:

CREATE TABLE tab
(
fa int NOT NULL,
fb int NOT NULL,
CONSTRAINT some_name UNIQUE (fa ,fb )
)

mysql中唯一约束用法的更多相关文章

  1. MYSQL中唯一约束和唯一索引的区别

    1.唯一约束和唯一索引,都可以实现列数据的唯一,列值可以有null.2.创建唯一约束,会自动创建一个同名的唯一索引,该索引不能单独删除,删除约束会自动删除索引.唯一约束是通过唯一索引来实现数据的唯一. ...

  2. mysql中event的用法详解

    一.基本概念mysql5.1版本开始引进event概念.event既“时间触发器”,与triggers的事件触发不同,event类似与linux crontab计划任务,用于时间触发.通过单独或调用存 ...

  3. MySql中的约束

    mysql中的约束使用和oracle使用差别不大. 1.主键约束 如同人对应身份证,主键能够唯一地标识表中的一条记录,可以结合外键来定义数据表之间的关系. 主键约束要求主键列的数据唯一,并且不允许为空 ...

  4. 一、TCL事务控制语言 二、MySQL中的约束 三、多表查询(重点) 四、用户的创建和授权 五、MySQL中的索引

    一.TCL事务控制语言###<1>事务的概念 事务是访问并可能更新数据库中各种数据项的执行单元. 事务是一条SQL语句,一组SQL语句,或者整个程序. 事务是恢复和并发控制的基本单位. 事 ...

  5. mysql中limit的用法实例解析

    mysql中limit的用法解析. 在mysql中,select * from table limit m,n.其中m是指记录开始的index,从0开始,n是指从第m条开始,取n条. 例如: mysq ...

  6. Mysql中limit的用法详解

    Mysql中limit的用法详解 在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,为我们提供了limit这样一个功能. SELECT * FROM table LIMIT [offset ...

  7. mysql中explain的用法

    mysql中explain的用法 最近在做性能测试中经常遇到一些数据库的问题,通常使用慢查询日志可以找到执行效果比较差的sql,但是仅仅找到这些sql是不行的,我们需要协助开发人员分析问题所在,这就经 ...

  8. MySQL中CONCAT()的用法

    MySQL中CONCAT()的用法 在日常开发过程中,特别是在书写接口的时候,经常会遇到字符串拼接的情况,比如在返回图片数据时,数据库里往往存储的是相对路径,而接口里一般是存放绝对地址,这就需要字符串 ...

  9. mysql中FIND_IN_SET函数用法

    本篇文章主要介绍mysql中FIND_IN_SET函数用法,用来精确查询字段中以逗号分隔的数据 以及其与 like 和 in 的区别 1.问题发现 之前在做工作任务时有这么一个需求:需要用接口所传的服 ...

随机推荐

  1. CSS3多媒体查询

    CSS2多媒体查询: @media规则在css2中有介绍,针对不同媒体类型(包括显示器,便携设备,电视机,等等)可以定制不同的样式规则. CSS3多媒体查询: CSS3多媒体查询继承了CSS2多媒体类 ...

  2. 【代码笔记】iOS-密码在进入后台1小时后重新设置

    代码: AppDelegate.m #import "AppDelegate.h" #import "ViewController.h" @interface ...

  3. 企业BI系统应用的切入点及五大策略

    从技术的角度来看,BI的技术正在走向成熟,处于一个发展的阶段,但它促使了BI的应用在成本方面开始逐步的降低,越来越多的企业在BI应用方面取得了成功.从实施的角度来出发,实施商业智能系统是一项复杂的系统 ...

  4. .NET 获取类内成员的名称,以字符串形式显示

    需要做一个功能,显示类内的属性名和对应的值.比如有类 Public Class SupervisedParams     Public TestMode As string     Public Ti ...

  5. Java实现后缀表达式建立表达式树

    概述 表达式树的特点:叶节点是操作数,其他节点为操作符.由于一般的操作符都是二元的,所以表达式树一般都是二叉树. 根据后缀表达式"ab+cde+**"建立一颗树 文字描述: 如同后 ...

  6. SecureCRT使用问题记录

    1.破解版下载&安装 参考:https://bbs.feng.com/read-htm-tid-6939481.html 2.session导入 查看 SecureCRT-Preference ...

  7. SQLSERVER将数据移到另一个文件组之后清空文件组并删除文件组

    SQLSERVER将数据移到另一个文件组之后清空文件组并删除文件组 之前写过一篇文章:SQLSERVER将一个文件组的数据移动到另一个文件组 每个物理文件(数据文件)对应一个文件组的情况(一对一) 如 ...

  8. mysql面试题目

    昨天晚上无意中翻译到baidu的 dba(mysql,redis) 面试题,阅读了一下,发现没有一个自己能完美解释的.这确实是温床导致的思维懒惰. 具体几个问题如下: 1:MySQL InnoDB存储 ...

  9. CSS| table property

  10. 利用VBA宏解除Excel保护

    复制以下代码并录制宏,运行一次即可. Option Explicit Public Sub AllInternalPasswords() ' Breaks worksheet and workbook ...