技术标签: 数据库技术
just do it
|
|||||||||
日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
---|---|---|---|---|---|---|---|---|---|
30 | 31 | 1 | 2 | 3 | 4 | 5 | |||
6 | 7 | 8 | 9 | 10 | 11 | 12 | |||
13 | 14 | 15 | 16 | 17 | 18 | 19 | |||
20 | 21 | 22 | 23 | 24 | 25 | 26 | |||
27 | 28 | 29 | 30 | 31 | 1 | 2 | |||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
本文出处:http://www.cnblogs.com/wy123/p/7350265.html
(保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错误进行修正或补充,无他)
SQL Server 数据库中的约束(Constrint)是作用是为了保证数据库的完整性和一致性,可以建表的时候指定某个字段要符合某种约束(或者对已有表的字段添加约束),比如唯一性(或者主键)约束,非空约束,默认值约束等
对于具体的约束,可以分为主键(唯一键)约束,默认值约束,检查约束,外键约束等几类。
约束的创建方式
1,建表的时候指定
如下,可以在建表的时候指定某些字段满足某种约束。
2,以创建约束的方式指定
也即在建表的时候没有指定任何约束,在建表之后,以alter table的方式指定某些字段上的约束
对于Check或者Default约束,也可以事先定义出来规则(Rule),然后将规则绑定到对应表的字段
如下分别定义了一个check约束和默认值约束,然后将表的字段绑定到对应的约束,这样做的好处是对于某些复杂的约束,定义好约束之后就可以重用了
需要注意的是,对于Rule来说,NULL值是不与任何规则冲突的,
举个例子,如下,虽然把TestConstrint.Sex字段指定了规则Rule_Sex,如果Sex定义的是int,该字段写入数据的时候只能是0或者1,写入2是失败的,
但是往该字段写入null值是可以的,因为null与规则指定的(0,1)相比没有任何意义(或者没有任何结果)
约束的一些特点
对于建表的时候指定的未命名的约束,SQL Server会自动生成后缀随机的默认的约束名字,为了增加规范性,正常情况下是不允许这么写的,因为我们不希望看到数据库中一堆乱七八脏的命名。
如果是指定约束的名字,看起来就规范多了。
如果是通过定义规则,然后绑定到表的字段的情况下,通过SSMS的图形界面,是看不到约束展开之后的内容的(虽然这个约束是生效的)
数据库约束中那些不容易被注意的坑
约束看起来非常简单,不管是在建表的时候直接指定,或者是通过alter 表的方式增加约束,看起来都没有任何问题,条条大道通罗马,不过里面还是有一些小坑的。
一个数据库中的约束不允许重名。
也就是意味着,不同的表之间,或者表上与自定义约束之间,都不能存在同名的情况,包括主键约束(不能同名),检查约束(check),默认值约束等,都不能同名
约束的道理跟表一样,一个库的一个schema下中不能定义同名的表一个道理,一个库的一个schema下不能定义同名的约束一样。
现在也不难理解,为什么sqlserver默认生成的约束的名字,后面是一串随机字符了吧?
1,表与表之间的约束不能同名
2,表与自定义约束名之间不能同名。
当然有人会说,这有什么,定义的时候报错就知道了,还有更大的坑。
这里涉及到约束的另一种定义方法,建表的过程中指定命名的主键约束。
比如如下的定义临时表的脚本,看起来没有任何问题,也确实没有任何问题,
实际中遇到的一个开发人员的问题,编写的存储过程中定义了临时表,定义临时表的时候指定了命名的主键约束(可能是抄的物理表的定义方式),测试通过并发布到生产环境中,一切看起来非常正常。
发布之后测试了两把,也表现为正常,等到系统真正被用户使用的时候,部分用户反馈系统(涉及到这个功能的地方)偶尔会报错,时而正常,时而不正常(其实这种问题最难诊断的了)。
监控应用程序会发现,某个时间段之内,发现这个存储过程会连续地报错一种错误,错误原因就是“无法创建索引或者约束”
开发人员也很委屈,提交完代码之后,明明是测试通过了的,更可恶的是,偶尔会报错,大部分时间是正常的。
通过观察其代码,然后冷静下来想一想,也不难理解,数据库中的约束是不能同名的,当然临时表生存的临时库也不例外,
临时表用完就会自动销毁没有错,意味着如果所有的Session都是串行执行,这个完全没有问题。
但是一旦出现并发调用的情况,不同的Session会同时调用这个存储过程,
一旦并发调用这个存储过程,不同的Session会创建同一个名字的约束,铁定只有一个会成功,这么看,单线程测试正常,并发上来之后报错也就不难理解了。
总结:
为了保证数据库的完整性和一致性(外键,本文未涉及),可以使用约束来达到这个目的,但是约束本身有自己的某些规则和特点,它跟其他数据库对象并没有不同的,都不允许同一个schema下存在同名的对象。
如果没有按照其自身的某些规则来使用,就有可能造成某些潜在的问题。
为了规范约束的命名,在定义约束名字的时候,要严格遵循简写前缀+schema+tableName+columnName的方式来定义,如果是临时表,禁止定义命名约束。
+加关注
1
发表评论
« 上一篇:MySQL InnoDB内存压力判断以及存在的疑问
» 下一篇:MySQL执行计划extra中的using index 和 using where using index 的区别
posted on 2017-08-12 15:27 MSSQL123 阅读(2259) 评论(0) 编辑 收藏
注册用户登录后才能发表评论,请 登录 或 注册,访问网站首页。
【推荐】超50万VC++源码: 大型组态工控、电力仿真CAD与GIS源码库!
相关博文:
· 数据库约束的一些用法总结(constraint)
· SQL基础--> 约束(CONSTRAINT)
· 关于 Oracle DB CONSTRAINT约束的一些SQL ORA-02292: integrity constraint violated
· SQL中有关死锁的一些知识
· Sql Server 2005 约束(constraint)的增加
最新新闻:
· 任正非回应一切,18年前他就在想如何系统过冬
· 巅峰上的微软,依然面临抉择
· 便利蜂被指强制裁员不给补偿 回应称正常年末考核
· 达沃斯释放了这些洞悉未来的信号
· 崔永元:盘盘百度!
» 更多新闻...
文章浏览阅读1.2k次。开环直流调速系统Matlab仿真实训三 晶闸管开环直流调速系统的MATLAB仿真实训一、实验实训目的1.学习并掌握晶闸管开环直流调速系统模型建立及模型参数设置的方法和步骤。2.熟悉并掌握系统仿真参数设置的方法和步骤。3.学会利用MATLAB软件对系统进行稳态与动态计算与仿真。4.巩固并加深对晶闸管开环直流调速系统理论知识的理解。二、实验实训原理及知识准备1. 晶闸管开环直流调速系统的原理图..._开环直流调速系统的matlab仿真
文章浏览阅读1.7k次。iscroll在部分手机上做下拉刷新的时候,高度会计算错误,显示为顶部部分高度被隐藏。当时使用版本是4.2.2。通过调试发现是iscroll源码的bug,在此Mark下,懒得提交Issue。iscroll4均有这个错误,在iscroll5里面已改正,但是只是在计算高度时做了防御式编程,根本原因估计还是没找到。图方便可以直接使用iscroll5,只是api变了。不想升级,可以按我的方式稍微修改下_iscroll transform
文章浏览阅读1.6k次。前言前一篇,已经讲了go语言中的使用。那么java端如何使用。1.定义用户结构public class User { private int id; private int age; private int sex; private String name; private String pic; // get set方法}_graphql.field
文章浏览阅读1w次。1、ps -eFHUID进程所有者的用户标识、PID进程的进程标识、PPID父进程的进程标识、SZ进程的核心映像的页面大小、RSS进程的实际内存(驻留集)大小(单位是 1KB)、PSR绑定内核线程的处理器(如果有)的逻辑处理器号,对一个进程来说,如果它的线程全都绑定到同一处理器上,则显示该字段、STIME进程的启动时间、TTY进程的控制工作站、TIME进程的执行时间总和、CMD包含命令名_psr top
文章浏览阅读3.4k次,点赞3次,收藏6次。错误日志错误分析一 . 配置文件中 <context:property-placeholder location=“classpath:db.properties” /> 标签没有写这个错误相信看完错误日志大家都能找的到, 就不多赘述了. 错误的原因就是, 如果没有加上面的标签, 那么下面配置文件代码中的property标签中的value属性的值就仅仅是一个string类型的..._caused by: java.lang.classnotfoundexception: ${jdbc.driverclassname}
文章浏览阅读931次。原生的项目页面调用了第三方控件,并且访问页面都正常。现在将H5嵌入原生后,apk入口访问H5页面,从H5页面点击菜单调用原生activity,没有第三方控件的页面可以打开,有第三方控件的页面打开应用白屏闪退。调用原生activity代码如下:var activity = plus.android.runtimeMainActivity();var Intent = plus.android.imp...
文章浏览阅读357次。语音合成技术主要有三部分:1、文本分析;2、韵律建模;3语音合成文本分析文本分析处理流程:输入文本→文本预处理→文本规范化→分词→词性标注→字音转换→韵律预测→输出拼音节奏等信息文本预处理包括删除无效符号,断句,内码转换等。文本规范化的任务就是将文本中的这些特殊字符识别出来,并转化为一种规范化的表达。字音转换的任务是将待合成的文字序列转换为对应的拼音序列,即告诉后端合成器应_crf预测重音
文章浏览阅读536次。首先看如下代码:a = ['0234','abcd']seta = set(a)b = ['0234']setb = set(b)c = ('0234','abcd')setc = set(c)d = ('0234')setd = set(d)e= tuple(b)sete = set(e)print(type(a), ' , ', a,' , ',seta)..._python list转化为set时长度发生变化
文章浏览阅读4.3k次。1.计算机专业专业课比较难,建议考研最好是本专业或者相关专业,有一定的基础,跨考有一定的难度。2.计算机考研主要分为学硕和专硕两个方向。学硕为计算机技术应用,专硕为计算机应用和软件工程。3.考试科目我这里只说学硕(专硕每个学校规定不同):一般情况下,初试为公共课+专业课。公共课考英语(学硕为英语一,难度较大)和政治,各占100分。专业课一考数学一,相对较难。专业课二考计算机专业基础。计算机专业基础..._408是哪个专业
文章浏览阅读117次。网站需要主题切换,但是iframe里读取不到改变后的css变量看文件只有一个我需要一个js的位置,能添加js到ifram
文章浏览阅读7.8k次,点赞9次,收藏50次。云计算一种利用互联网实现随时随地、按需、便捷地使用共享计算设施、存储设备、应用程序等资源的计算模式。云计算系统由云平台、云存储、云终端、云安全四个基本部分组成,云平台从用户的角度可分为公有云、私有云、混合云等。通过从提供服务的层次可分为:基础设施即服务(Iaas)、平台即服务(Paas)和软件即服务(Saas)通过将应用部署到云端后,可以不必再关注那些令人头疼的硬件和软件问题,它们会由云服务商去解..._云计算 雾计算
文章浏览阅读5.5k次,点赞3次,收藏23次。按键抖动的原因:通常按键所用的开关都是机械弹性开关。当按键触点闭合或者断开时,由于机械触点的弹性特点,一个按键开关在闭合时不会马上就稳定的接通。在断开时也不会一下子就彻底断开。而是在闭合和断开时伴随了一系列抖动。按键消抖的方法:硬件消抖和软件消抖硬件消抖:利用电容的充放电特性对抖动过程中产生的电压毛刺进行平滑处理。软件消抖:通过延迟程序过滤,通过延迟来过滤掉抖动时间。..._stm32定时器扫描按键