前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布

约束

作者头像
liulun
发布2022-05-08 17:47:31
7960
发布2022-05-08 17:47:31
举报
文章被收录于专栏:liulunliulun

一:类型 约束的类型一共分三种 域约束:      涉及一个或多个列,(限制某一列的数据大于0) 实体约束:     相同的值不能存在于其他的行中 引用完整性约束:  一个表中的一个列与某个表中的另一个列的值匹配 二:命名 约束是可以命名的  一般这样命名: pk_customer_*** pk代表主键   customer代表主键所在的表 后面是你自己定义的(要确保整个名称的唯一性) 三:主键约束 主键约束:一般就是id,   一个表中最多有一个主键 例子1 use accounting create table employee (

id    int   identity  not null, firstname   varchar(20)  not null ) 例子2 use accounting alter  table  employee add  constraint  pk_employeeid primary key (id) 四:外键约束 外键约束用在确保数据完整性和两个表之间的关系上 先看例子 create table orders ( id     int     identity  not null   primary key, customerid   int  not null  foreign  key  references  customer(id), orderdate    smalldatetime   not null, eid   int  not null ) 注意:这个表的外键必须是另一个表的主键! 在现有表上添加外键 alter   table  orders add  constraint  fk_employee_creator_order foreign   key   (eid)   references employee(employeeid) 使用表自引用 表内至少要有一行数据才可以这么做 alter table employee add constraint   fk_employee_has_manager foreign  key (managerid)   references   employee(employeeid) 创建表的时候做表自引用  就可以忽略  foreign  key  语句 表自引用的外键列  必须允许为null     要不是不允许插入的(避免对最初行的需要) 一个表与另一个表有约束,这个表是不能被删除的   级联操作 先看例子 create       table       orderdetails (            orderid       int       not     null        ,            id               int        not     null      ,           description        varchar(123)        not     null,           --设置主键           constraint        pkOrderdetails      primary       key       (orderid,id),           --设置外键,级联操作           constraint        fkOrderContainsDetails                       foreign      key      (orderid)                references        orders(orderid)                on     update       no       action                on       delete        cacade )

on      delete   cacade   当删除父记录时       同时删除该记录 也就是当删除orders表中的一条记录, 与之相关的orderdetails表中的记录也将被删除 级联的深度是没有限制的,但是每个外键都必须设置on      delete   cacade  no action是可选的 五:unique约束 unique约束与主键约束类似,同样也是要求指定的列有唯一的值 但是一个表中可以有多个unique约束的列,同时这个列允许存在null值。(最多有一个null值) 看例子: create table  shippers (  id    int   indentity  not null primery key, zip    varchar(10) not null  , phoneno   varchar(14)  not null  unique

) 例子二: alter    table    employee add  constraint   ak_employeeSSN unique(ssn) 六:check约束 check不局限于一个特定的列,可以约束一个列,也可以通过某个列来约束另一个列 定义check约束使用的规则与where子句中的基本一样 下面我写几个 between  1 and 12 like   '[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9][0-9]' in  ('ups','fed ex','usps') price >=0 shipdate >= orderdate 看例子: alter  table  customers add constraint cn_customerDateinsystem check (dateinsystem <= getdate()) getdate()函数得到当前时间,上面这个例子的意思是dateinsystem列的数据不能大于当前时间 现在如果给这个列插入一个明天的时间,就会出错 七:default约束 如果插入的新行在定义了默认值的列上没有给出值,那么这个列上的数据就是定义的默认值 默认值只在insert语句中使用 如果插入的记录给出了这个列的值,那么该列的数据就是插入的数据 如果没有给出值,那么该列的数据总是默认值 八:禁用约束 在创建约束之前,数据库中已经有一些不符合规矩的数据存在。 创建约束之后,又想加入一些不符合规矩的数据。 这些时候就要禁用约束。primary key  和  unique约束  这对孪生约束是不能禁用的 对一个已经存在数据的表加一个约束: alter  table  customers  add constraint cn_customerPhoneNo check (phone like '([0-9][0-9][0-9])[0-9][0-9][0-9][0-9][0-9][0-9]') 如果表内有不符合这个约束的记录,sqlserver就会报错 如果这样写,就不会报错了 alter  table  customers  with no check add constraint cn_customerPhoneNo check (phone like '([0-9][0-9][0-9])[0-9][0-9][0-9][0-9][0-9][0-9]') 如果需要把一些不符合规矩的数据加入到表中怎么办

这时候就需要临时禁用现有的约束: alter  table customers nocheck constraint  cn_customerPhoneNo --允许不带套插入,此处的名称是前面定义的 insert into customer (phone) values (123456) --开始不带套插入! alter table customers check constraint cn_customerPhoneNo --下次插入要带套 九:规则 先看例子: Create rule SalaryRule as  @salary >0; sp_bindrule  'SalaryRule' ,  'Employee.Salary' 第一句定义了一个规则叫SalaryRule 进行比较的事物是一个变量 这个变量的值是所检查的列的值 第二句把规则绑定到某个表的一个列上 规则和ckeck约束很相似, 但是规则只作用在一个列上 一个规则可以绑定在多个列上,但是它不会意识到其他列的存在 check可以定义column1>=column2 取消规则 exec   sp_unbindrule  'Employee.Salary' 删除规则 Drop  rule  SalaryRule 十:默认值 默认值与default约束类似(有区别的,但是我说不清楚) 先看例子: create default salarydefault as 0; exec sp_binddefault   'salarydefault' , 'employee.salary'; 取消默认值: exec sp_unbinddefault  'employee.salary' 删除默认值: drop  default  'salarydefault'

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2008-11-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档