CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  应用实例

用TSQL语句如何知道CHECK约束的三个属性????

楼主sizheng0320(四正)2005-01-03 17:15:49 在 MS-SQL Server / 应用实例 提问

通过对sysobjets、sysconstraints、syscomments的查询,可以得到CHECK约束作用的对象、CHECK约束的名称以及内容,但是如何得知CHECK约束的“创建中检查现存数据”、“对复制强制约束”、对INSERT和UPDATE强制约束”三个属性的值呢?在企业管理器中可以通过复选框来选的,在查询结果中哪项是???  
   
  帮助里面对这三个表(视图)的介绍中好多字段为“保留”,唉。 问题点数:20、回复次数:9Top

1 楼chinaandys(降龙十八炒&&蛋炒饭)回复于 2005-01-03 17:26:01 得分 6

check核查约束。是确定数据完整性的约束之一。是用来检查你所输入的数据是否符合check约束.  
   
   
  最安全的,两个都要选.--insert和update强制约束.  
   
  偶一般用TSQL语句Top

2 楼sizheng0320(四正)回复于 2005-01-03 17:31:47 得分 0

是这样的,我想在界面中显示出这三个属性,如何得到它们的值?做得就像企业管理器中的样子。  
   
  哪个字段是这三个属性的值?我读出来好根据它们来判断……Top

3 楼631799(杭州工人)回复于 2005-01-03 18:32:10 得分 6

alter   table   tb   add   constraint   ck_a   check   length(name)<=8                             --检查现有数据  
  alter   table   tb   with   nocheck   add   constraint   ck_a   check   length(name)<=8   --忽略现有数据Top

4 楼sizheng0320(四正)回复于 2005-01-03 18:37:19 得分 0

您说的这个我也知道。  
  唉,看来我还是没说明白。  
   
  刚才试验了一下,发现在企业管理器中改变CHECK约束的那三个属性(改变复选框的状态),查询sysobjects表中相应的CHECK约束记录,发现其status字段的值发生改变,但我又找不到规律。  
   
   
  我的意思是,能否有什么方法,在相关的系统表中查询某个字段,其值为0就为“创建中检查现存数据”、其值为1就为“对复制强制约束”之类的???Top

5 楼chinaandys(降龙十八炒&&蛋炒饭)回复于 2005-01-03 18:38:25 得分 8

syscontranintsTop

6 楼sizheng0320(四正)回复于 2005-01-03 19:00:25 得分 0

constid   int   约束号。    
  id   int   拥有该约束的表   ID。    
  colid   smallint   在其上定义约束的列   ID,如果是表约束则为   0。    
  spare1   tinyint   保留。    
  status   int   位图指示状态。可能的值包括:    
  1   =   PRIMARY   KEY   约束。  
  2   =   UNIQUE   KEY   约束。  
  3   =   FOREIGN   KEY   约束。  
  4   =   CHECK   约束。  
  5   =   DEFAULT   约束。  
  16   =   列级约束。  
  32   =   表级约束。  
     
  actions   int   保留。    
  error   int   保留。    
   
  以上是该系统表的介绍。但实际上这是个系统视图,是基于sysobjects生成的,这个姑且不管,那么哪个字段可以看出一个CHECK约束的三个属性的状况呢?  
  也就是说,对于一个CHECK约束,是否创建中检查现存数据”、是否“对复制强制约束”、是否“对INSERT和UPDATE强制约束”,如何看出来???Top

7 楼sizheng0320(四正)回复于 2005-01-04 16:37:28 得分 0

发现改变三个属性的状态后,sysobjects中相应记录的status值发生变化,似乎有规律可循。  
   
  意外发现的是,改变状态后,id居然也发生变化。估计是UPDATE是先DELETE后INSERT的原因吧。Top

8 楼sizheng0320(四正)回复于 2005-01-05 00:32:59 得分 0

试验了一下,已得出结论如下:  
  “创建中检查现存数据”、“对复制强制约束”、“对INSERT和UPDATE强制约束”三项属性分别对应000的三位,0为不选,1为选中  
   
  建立一个测试表,为其建立列级CHECK约束和表级CHECK约束,先令其为空表。  
  下面结果中,等号左边为三个属性的选中状态,右边为sysobjects表中约束记录的status字段值:  
  对于列级约束:  
  000=3330  
  001=3074  
  010=2306  
  011=2050  
  100=3330(保存后仍未选中,不知为何)  
  101=3074  
  110=2306  
  111=2  
  发现除111外,其余首位为1均作为0看待。  
   
  对于表级约束:  
  000=3328  
  001=3072  
  010=2304  
  011=2048  
  100=3328  
  101=3072  
  110=2304  
  111=0  
  可发现与列级约束有同样的问题,同时,对于相同的二进制值,表级约束比列级约束少2。  
   
  但值得注意的是,以上测试是在表中无数据的情况下,故可能引起三位二进制数的最高位无意义。下面测试表中有数据的结果:  
   
  对于列级约束:  
  000=3330  
  001=3074  
  010=2306  
  011=2050  
  100=3330  
  101=3074  
  110=2306  
  111=2  
   
  对于表级约束:  
  000=3328  
  001=3072  
  010=2304  
  011=2048  
  100=3328  
  101=3072  
  110=2304  
  111=0  
   
  可见结果完全相同。  
  猜测原因是“创建中检查现存数据”一项只在CHECK约束保存瞬间作用,保存后系统即将其取  
  消,故若查看已有的CHECK约束,该选项已无意义,故为不选中状态。  
   
  写的可能有点乱,不知各位看懂没,呵呵。Top

9 楼tuwicn(木狼)回复于 2005-03-07 22:33:25 得分 0

楼主的钻研精神令人尊敬!Top

相关问题

  • 求救约束语句
  • 如何用sql语句删除主键约束,并且在修改了列属性之后再把主键约束加上(放分100,解决问题立即相送,决不食言)
  • 如何用sql语句删除主键约束,并且在修改了列属性之后再把主键约束加上(放分100,解决问题立即相送,决不食言)
  • INSERT 语句与 COLUMN FOREIGN KEY 约束冲突。
  • DELETE 语句与 COLUMN REFERENCE 约束冲突?怎么解决?
  • 求教关于一个表的约束语句的区别
  • DELETE 语句与 COLUMN REFERENCE 约束 'FK__titleauth__au_id__0519C6AF' 冲突
  • 怎么用sql语句为表增加一个主键约束
  • 如何用SQL语句修改列的属性?
  • 如何通过语句改变CStatic的caption属性

关键词

  • 属性
  • check
  • 数据
  • check约束
  • 强制约束
  • 值

得分解答快速导航

  • 帖主:sizheng0320
  • chinaandys
  • 631799
  • chinaandys

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo