键和约束

级联操作:
ON UPDATE  NO ACTION
ON DELETE  CASCADE
在父表中进行了删除操作,这个删除操作还是级联到了子表中匹配的记录,两个表中的记录都被删除了,如果在表中定义了CDSCADE更新,并且更新了一个相关记录,那么随后这个操作也会传播到子表中。


其他级联操作:
SET NULL和SET DEFAULT是在SQL Server 2005中引入的,所以如果想与SQL Server 2000向后兼容的话,应避免使用这两个操作。
如果执行更行改变了一个父行的值,那么子行的值将被设置为NULL,或者设置为该列的默认值。


外键的双向实现方式:
在默认情况下,末记录被依赖表引用,就不能从被引用表中删除该记录或者更新被引用的咧。如果希望能更新或删除这样的记录,那么需要为删除和/或更新设置CASCADE操作。



唯一约束:
创建新表:
CREATE TABLE Shippers
(
   ShipperID     int   IDENTITY   NOT NULL
      PRIMARY KEY,
   ShipperName   varchar(30)      NOT NULL,
   Address       varchar(30)      NOT NULL,
   City          varchar(25)      NOT NULL,
   State         char(2)          NOT NULL,
   Zip           varchar(10)      NOT NULL,
   PhoneNo       varchar(14)      NOT NULL
      UNIQUE
);

在已存在的表中创建唯一约束:
ALTER TABLE Employees
   ADD CONSTRAINT AK_EmployeeSSN
   UNIQUE (SSN);


CHECK约束:
ALTER TABLE Customers
   ADD CONSTRAINT CN_CustomerDateInSystem
   CHECK
   (DateInSystem <= GETDATE ());

当插入不符合条件时就会报错。

DEFAULT约束:
1、默认值只在INSERT语句中使用,在UPDATE语句中和DELETE语句中被忽略。
2、如果在INSERT语句中提供了任意值,就不使用默认值。
3、如果没有提供值,那么总是使用默认值。


在CREATE TABLE语句中定义DEFAULT约束:
创建Shippers表:
CREATE TABLE Shippers
(
   ShipperID      int   IDENTITY   NOT NULL
      PRIMARY KEY,
   ShipperName    varchar(30)      NOT NULL,
   DateInSystem   smalldatetime    NOT NULL
      DEFAULT GETDATE ()
);
当不提供DateInSystem值时,DateInSystem生成默认值。


在已存在的表中添加DEFAULT添加约束:
例:
ALTER TABLE Customers
   ADD CONSTRAINT CN_CustomerDefaultDateInSystem
      DEFAULT GETDATE() FOR DateInSystem;

ALTER TABLE Customers
   ADD CONSTRAINT CN_CustomerAddress
      DEFAULT 'UNKNOWN' FOR Address1;


禁用约束:
禁用一个数据完整性规则通常是因为已经有无效数据了。这样的数据通常分为以下两类:
再创键约束时已经在数据库中的数据。
在约束创建后希望添加的数据。
注:不能禁用主键约束和唯一约束。


再创键约束时忽略无效的数据:
要添加一个约束,但是又不见其应用到已存在的数据中,那么可以在执行ALTER TABLE 语句添加约束时使用WITH NOCHECK选项。
例:
ALTER TABLE Customers
   WITH NOCHECK
   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][0-9]');



临时禁用已存在的约束:
采用名为NOCHECK的选项来运行ALTER语句,这样可以取消需要处理的约束。
例:
ALTER TABLE Customers
   NOCHECK
   CONSTRAINT CN_CustomerPhoneNo;

启动约束:
ALTER TABLE Customers
   CHECK
   CONSTRAINT CN_CustomerPhoneNo;


规则:
规则和CHECK约束非常相似。他们之间的唯一区别是规则每次只能作用于一个列。可以将同一个规则分别绑定到一个表中的多个列,但是规则分别作用于每个列,根本不会意识到其他列的存在。
定义一个规则:
CREATE RULE SalaryRule
   AS @Salary > 0;

将规则绑定到一列:
EXEC sp_bindrule 'SalaryRule', 'Employees.Salary';
从列中删除规则:
EXEC sp_unbindrule 'Employees.Salary';
删除规则:
DROP RULE SalaryRule


默认值:
定义一个默认值:
CREATE DEFAULT SalaryDefault
   AS 0;

将默认值绑定到对象:
EXEC sp_bindefault 'SalaryDefault', 'Employees.Salary';
从表中解除默认值绑定:
EXEC sp_unbindefault 'Employees.Salary'

删除默认值:
DROP DEFAULT SalaryDefault

查看那些表和数据类型在使用默认值:
EXEC sp_depends <object name>



如何选择:
约束:
优点:快速、可以引用其他列、在执行命令前发生、遵循ANSI标准。
缺点:必须对每个表重新定义、不能引用其他表、不能绑定到数据类型。
规则、默认值:
优点:独立的对象、可重用、可以绑定到数据类型、在命令执行前发生。
缺点:稍慢、不能跨列引用、不能引用其他表、实际上已用于向后兼容。
触发器:
优点:非常灵活、可以引用其他列或者其他表、可以通过.NET引用SQL Server外部的其他信息。
缺点:在命令执行之后发生、系统开销很大。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值