约束sql server 检查约束不通过什么意思

9322人阅读
&1.约束定义了必须遵循的的用户维护数据一致性和正确性的规则,是强制实现数&& 据完整性的主要途径。
&&&&&& 主键约束(primary&&& key)
&&&&&& 唯一性约束(unique)
&&&&&& 检查约束(check)&&&& 条件的构造
&&&&&&&&&&&&&& 范围&&&&& 字段&&&& in(集合)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 字段&&& between........and
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 字段&& &=value1&&&&&& and&&&&&&&& 字段&=value1
&&&&&&&&&&&& 逻辑运算符:& and
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& or
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &not
&&&&&&&&&&&&&& 困难所在:要求字段符合一定的模式或者叫做模式匹配
&&&&&&&&&&&&&& [NOT]LIKE(模糊查询也用到它)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& check(stuName&& like&& 'li_')
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& like的使用最重要的是要掌握通配符
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 重点在于patten的构造
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 1.普通字符
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 2.通配符:% 代表零个或更多字符的任意字符串
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& _代表一个字符
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& []代表指定范围[a-f]或集合([abcdef])中的任何单个字符
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& [^]不属于指定范围([a-f])或集合([abcdef])中的任何单个字符
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 例如:& check (& stuName&&&& LIKE&&& ' [% ]')
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& check(& stuName&&& LIKE&&& ' 张[%]')
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& check( stuAge&& LIKE ' [18-20] '&& AND&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& NOT&&&& LIKE& ' [^19] '
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& check( stuAge&&& IN(18-19))
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 年龄在18-20,但不等于19
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 3.转义字符
&&&&&& 默认约束
&&&&&& 外键约束(参照约束)
& 约束可以在以下两个层次上实施:
&&&& 列级:用户定义的约束只对表中的一列起作用。
&&&& 表级:用户定义的约束对表中的多列起作用。
2.约束的创建
&&&& (1).创建表的同时,建立约束,使用CREATE&&&& TABLE语句创建约束
&&&&&&&&&&&&&&&&&&&&&&& CREATE&&& TABLE&&& 表名
&&&&&&&&&&&&&&&&&&&&& (
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 列名&&& 列的数据类型
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& CONSTRAINT&&&& 约束名&&&&& 约束的类型
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ......n
&&&&&&&&&&&&&&&&&&&&&&& )
&&&&&&& ( 2).表创建后,通过修改来实现约束的添加,使用ALTER&& TABLE命令
&&&&&&&&&&&&&&&&&&&&&& ALTER&&& TABLE&&& 表名
&&&&&&&&&&&&&&&&&&&&&&&& WITH&&& CHECK | WITH&&& NOCHECK
&&&&&&&&&&&&&&&&&&&&&& ADD&& CONSTRAINT&&& 约束名&&&& 约束的类型
3.主键约束(PRIMARY&&&&& KEY)
&& 主键用于唯一地标识表中的每一条记录
&&& 可以定义一列或多列为主键
&& 主键列上没有任何两行具有相同值(即重复值)
&& 主键列上也不能为空值
4.唯一性约束(UNIQUE)
&& 唯一性约束用来限制不受主键约束的列上的数据的唯一性,
&& 即表中任意两行在& 指定列上都不允许有相同的值。
&& 一个表上可以放置多个唯一性约束
&& 唯一性约束和主键约束的区别:
&&& (1).唯一性约束允许在该列上存在NULL值,而主键约束的限制更为严格,不但不允许有重复,而且也不允许有空值。
&&& (2).在创建唯一性约束和主键约束时可以创建聚集索引和非聚集索引,但在 默认情况下主键约束产生聚集索引,而唯一性约束产生非聚集索引
5.检查约束(CHECK)
&&&& 检查约束用来指定某列的可取值的范围。
&&&& 它通过限制输入到列中的值来强制域的完整性。
6.默认约束(DEFAULT)
&&& 默认约束用于给表中的指定列赋予一个常量值(默认值),当向该表插入数据&& 时如果用户没有明确给出该列的值,SQL Server会自动为该列输入默认值。每&& 列只能有一个默认约束。
&&& add& constraint& 名字&&& default&& (表达式& Null)& for&&& 默认约束的字段名
7.外键约束(FOREIGN&&& KEY)
&&& 外键约束用于与其他表(称为参照表)中的列(称为参照列)建立连接。
&&& 将参照表中的主键所在列或具有唯一性约束的列包含在另一个表中,这些列就&&&& 构成了另一个表的外键。
&&& 当参照表中的参照列更新后,外键列也会自动更新,&& 从而保证两个表之间的&& 一致性关系。
&&&& 注意:(1).将“强制外键约束”或&强制用于复制”设置为“是”,能确保任何数据添加、修改或删除操作都不会违背外键关系
&&&&&&&&&&&&&&&&&&&& (2).将“更新规则”或&删除规则”设置为“无操作”,拒绝更新或删除主键表
&&&&&&&&&&&&&&&&&&&&&&&&&&&将“更新规则”或&删除规则”设置为“层叠”,级联更新或删除从表中相应的所有行
&&&&&&&&&&&&&&&&&&&&&&&&&& 将“更新规则”或&删除规则”设置为“设置空”,将外键表中相对应的外 键值设置为空值NULL
&&&&&&&&&&&&&&&&&&&&&&&&&& 将“更新规则”或&删除规则”设置为“设置默认值”,如果外键表的所有外键列均已定义默 认值,则该列设置为默认值
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:129701次
积分:2221
积分:2221
排名:第13247名
原创:105篇
评论:16条
(1)(1)(1)(1)(2)(1)(2)(10)(19)(9)(20)(25)(9)(13)查看: 1996|回复: 6
推迟约束检查 有什么作用?
论坛徽章:11
一直不觉得这个有什么作用,ORACLE有这么一个特行有什么目的?
论坛徽章:7
第一次听说。
招聘 : 论坛徽章:9
考虑如下场景:
一个表某个字段的数据是不唯一的,你希望在这个字段上添加唯一性约束,每当你处理完使之唯一后又有新的数据插入破坏了唯一性,如此这般就陷入了一个可怕的循环中。
Oracle这个特性可以帮助你先不对原有的数据进行唯一性检测而仅对新添加的数据进行唯一性检测,挡住那些“坏数据”,然后回过头来再处理那些不唯一的数据。
论坛徽章:1
原帖由 killkill_shadow 于
14:30 发表
考虑如下场景:
一个表某个字段的数据是不唯一的,你希望在这个字段上添加唯一性约束,每当你处理完使之唯一后又有新的数据插入破坏了唯一性,如此这般就陷入了一个可怕的循环中。
Oracle这个特性可以帮助你先不对原有的数据进行唯一性检测而仅对新添加的数据进行唯一性检测,挡住那些“坏数据”,然后回过头来再处理那些不唯一的数据。
如楼上所说,如果是一组事务,存在外键检查。可以推迟到事务提交时,进行验证。这样可以忽略掉插入顺序导致的数据被拒绝
论坛徽章:298
原帖由 killkill_shadow 于
14:30 发表
考虑如下场景:
一个表某个字段的数据是不唯一的,你希望在这个字段上添加唯一性约束,每当你处理完使之唯一后又有新的数据插入破坏了唯一性,如此这般就陷入了一个可怕的循环中。
Oracle这个特性可以帮助你先不对原有的数据进行唯一性检测而仅对新添加的数据进行唯一性检测,挡住那些“坏数据”,然后回过头来再处理那些不唯一的数据。
好像不是这个意思吧,这应该是某个约束ENABLE,但不VALIDATE。
延迟约束是指在提交时再检查该约束下,而不是在插入时就检查,比如一个主子表,正常情况下应该先插入主表,再插入子表,但若对子表
作延迟检查,则无需强调主子表数据的先后顺序,
一般情况下:
SCOTT@portal&create table pt (id number(3) primary key);
Table created.
Elapsed: 00:00:00.10
SCOTT@portal&create table ft (id number(3) references pt);
Table created.
Elapsed: 00:00:00.03
SCOTT@portal&insert into ft select 1
insert into ft select 1 from dual
ERROR at line 1:
ORA-02291: integrity constraint (SCOTT.SYS_C0081985) violated - parent key not found
Elapsed: 00:00:00.00
SCOTT@portal&insert into pt select 1
1 row created.
Elapsed: 00:00:00.01
SCOTT@portal&insert into ft select 1
1 row created.
Elapsed: 00:00:00.00
SCOTT@portal&
SCOTT@portal&
Table dropped.
Elapsed: 00:00:00.18
SCOTT@portal&
Table dropped.
Elapsed: 00:00:00.03
SCOTT@portal&create table pt (id number(3) primary key);
Table created.
Elapsed: 00:00:00.01
SCOTT@portal&
SCOTT@portal&create table ft (id number(3) references pt initially deferred);
Table created.
Elapsed: 00:00:00.01
SCOTT@portal&insert into ft select 2
1 row created.
Elapsed: 00:00:00.01
SCOTT@portal&insert into pt select 2
1 row created.
Elapsed: 00:00:00.01
招聘 : 论坛徽章:9
回复 #5 ZALBB 的帖子
呵呵,可能我没有理解楼主的意思,我再复习一下概念。
论坛徽章:3
ZALBB 发表于
好像不是这个意思吧,这应该是某个约束ENABLE,但不VALIDATE。
有道理,延迟约束检查在你这个例子里用,是挺好的
itpub.net All Right Reserved. 北京皓辰网域网络信息技术有限公司版权所有    
 北京市公安局海淀分局网监中心备案编号: 广播电视节目制作经营许可证:编号(京)字第1149号您所在的位置: &
检查约束(1)
检查约束(1)
电子工业出版社
《从零开始学Oracle》第5章
索引和约束,本章讨论了与数据库表相关的两个重要的方案对象:索引和约束。灵活地应用索引,可以提高数据检索的速度,提高数据库的性能;约束提供了数据的完整性和一致性的保障。本节为大家介绍检查约束。
5.2.4& 检查约束(1)
检查约束允许用户在表列中应用一系列的自定义的逻辑,比如工资数必须要大于500,通过指定表达式来检查新插入或更新的字段值,如果布尔表达式结果为False或者是NULL,执行操作的SQL语句将会被回滚,Oracle同时会产生一个异常。一般情况下使用检查约束检查单个字段,有的时候也会使用检查约束验证多个字段。
检查约束既可以在列级别进行定义,也可以在表级别进行定义。与其他对象的定义类似,当在列级别创建检查约束时,只能约束一个字段,而在表级别创建检查约束的话,则可以根据需要同时指定一个或多个字段。
在创建表时,可以直接在字段的后面使用CHECK子句添加检查约束,大多数情况下使用CONSTRAINT为检查约束指定一个友好的名称,CONSTRAINT创建检查约束的语法如下所示:[CONSTRAINT&constraint_name]&CHECK&(condition)&
为了演示检查约束的作用,下面创建了invoice_check表,该表的字段定义级别直接使用CHECK子句定义发票总额和支付总额的检查约束,如下代码所示: CREATE&TABLE&invoice_check &( &&&&invoice_id&NUMBER&, &&&&invoice_total&&NUMBER(9,2)&&CHECK&(invoice_total0&AND&invoice_total=5000)&,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&payment_total&NUMBER(9,2)&&DEFAULT&0&CHECK(payment_total0&AND&payment_total=10000) &); &
可以看到,创建语句使用CHECK子句为invoice_total的值指定范围为大于0且小于等于5000,payment_total字段的值指定范围为大于0且小于等于10000。当向invoice_check表中插入不符合检查约束条件范围的值时,SQL语句将被回滚并抛出Oracle异常。例如当向invoice_check表中插入不超出检查约束指定范围的值时,会产生如下所示的异常: INSERT&INTO&invoice_check&VALUES(1,-100,20000); &当执行该语句时,Oracle会提示如下所示的异常: &SQL&INSERT&INTO&invoice_check&VALUES(1,-100,20000); &INSERT&INTO&invoice_check&VALUES(1,-100,20000) &* &第1行出现错误: &ORA-02290:&违反检查约束条件&(SCOTT.SYS_C0011726) &
与其他的约束创建相似,在列级别只能对单个字段定义检查约束,为了可以同时对多个字段进行约束,可以在表级别进行创建。为了演示表级别的检查约束创建,下面的代码使用CONSTRAINT关键字同时对invoice_total和payment_total进行了约束,如下代码所示:CREATE&TABLE&invoice_check &( &&&&invoice_id&NUMBER&, &&&&invoice_total&&NUMBER(9,2)&DEFAULT&0&, &&&&payment_total&NUMBER(9,2)&&DEFAULT&0, &&&&CONSTRAINT&invoice_ck&CHECK(invoice_total=5000&AND&payment_total=10000) &); &
可以看到在表级别为约束定义了一个友好的名称。在定义中同时指定了invoice_total和payment_total约束,也就是说只有这两个字段的值都满足条件时才能满足约束条件,才能存储列值,否则当执行类似如下的代码时,会触发异常:SQL&INSERT&INTO&invoice_check&VALUES(1,); &INSERT&INTO&invoice_check&VALUES(1,) &* &第&1&行出现错误: &ORA-02290:&违反检查约束条件&(SCOTT.INVOICE_CK) &
【责任编辑: TEL:(010)】&&&&&&
关于&&的更多文章
Java EE(以前叫做Java 2平台,企业版)是一个为支持企业级应用
本书描述了黑客用默默无闻的行动为数字世界照亮了一条道路的故事。
《项目管理实战:Microsoft Project 精髓与方法》是权
一个深受用户喜爱的好产品和一个让人觉得凑合用的一般
本书通过梳理大型网站技术发展历程,剖析大型网站技术
本书是对Java EE各种技术之间互相协作的概览和补充。
本书还展示了如何编写JavaServer Page(JSP)页面或者企业级JavaBean(EJ
51CTO旗下网站

我要回帖

更多关于 sql检查约束 的文章

 

随机推荐