第 8 章  数据完整性
本章内容 <ul><li>8.1  数据完整性概述 </li></ul><ul><li>8.2  使用规则实施数据完整性 </li></ul><ul><li>8.3  使用默认值实施数据完整性 </li></ul><ul><li>8.4  使用...
8.1  数据完整性概述 <ul><li>完整性定义 </li></ul><ul><ul><li>数据完整性有 4 种类型: </li></ul></ul><ul><ul><li>实体完整性 (Entity Integrity) 、 </li>...
8.2  使用规则实施数据完整性 <ul><li>8.2.1  创建规则 </li></ul><ul><li>8.2.2  查看和修改规则 </li></ul><ul><li>8.2.3  规则的绑定与松绑 </li></ul><ul><li>...
8.2.1  创建规则 <ul><li>规则 (Rule) 是数据库中对存储在表中列的值或用户定义数据类型的规定和限制,它指定字段可接受哪些数据值。 </li></ul><ul><li>规则是单独存储的独立的数据库对象。 </li></ul><...
8.2.1  创建规则 <ul><ul><li>检查约束是在 CREATE TABLE 或 ALTER TABLE 语句中定义的,嵌入了被定义的表结构,即删除表的时候检查约束也就随之被删除。 </li></ul></ul><ul><ul><li...
例、创建一个数据表 employee1 ,包含 4 个字段:员工编号、员工姓名、职务、工资,要求将员工编号设置为主键,并创建一个规则 ru_salary ,将该规则绑定到表 employee 的“工资”字段上,限定该字段的值为 2000 ~ 1...
1 .用企业管理器创建规则 <ul><li>在企业管理器中选择数据库对象“规则”,单击右键从快捷菜单中选择“新建规则”选项,即会弹出如图所示的“规则属性”对话框。 </li></ul><ul><li>输入规则名称和表达式之后,单击“确定”按钮,...
2 .用 CREATE RULE 语句创建规则 <ul><li>CREATE RULE 语句用于在当前数据库中创建规则,其语法格式如下: </li></ul><ul><ul><li>CREATE RULE rule_name AS condit...
<ul><ul><li>CREATE RULE hire_date_rule </li></ul></ul><ul><ul><li>AS @hire_date>='1980-01-01' and @hire_date<=getdate() </...
<ul><ul><li>CREATE RULE grade_rule </li></ul></ul><ul><ul><li>AS @value between 1 and 100 </li></ul></ul><ul><li>例 8-4  创建...
<ul><li>1 .用企业管理器查看和修改规则 </li></ul><ul><li>在企业管理器的数据库对象中选择“规则”对象,即可从右边的任务板中看到规则的大部分信息,包括规则的名称、所有者、创建时间等。 </li></ul>8.2.2  ...
<ul><li>使用 sp_helptext  系统存储过程可以查看规则的文本信息。 </li></ul><ul><li>例 8-5  查看规则 hire_date_rule 的文本信息 </li></ul><ul><ul><li>EXECUT...
8.2.3  规则的绑定与松绑 <ul><li>需要将规则与数据库表或用户定义对象联系起来,才能发生作用。联系的方法称为绑定,所谓绑定就是指定规则作用于哪个表的哪一列或哪个用户定义数据类型。 </li></ul><ul><li>表的一列或一个用...
<ul><li>在企业管理器中,展开数据库( Sales )文件夹,鼠标单击“规则”选项,在右窗格中选择要进行绑定的规则( hire_date ),单击鼠标右键,从快捷菜单中选择“属性” 菜单项,打开“规则属性”对话框,如图 8-4 所示。 <...
<ul><li>在图 8-4 中单击“绑定 UDT(U)” 按钮,则出现“将绑定规则到用户定义的数据类型”对话框,如图 8-5 所示; </li></ul>8.2.3  规则的绑定与松绑
<ul><li>单击“绑定列 (B)” 按钮,则出现如图 8-6 所示的“将绑定规则到列”对话框。 </li></ul><ul><li>在“将规则绑定列”对话框的左边“未绑定的列”列表框中选择一列“添加”到右边“绑定列”列表框中,就实现规则绑定...
2 .用系统存储过程 sp_bindrule 绑定规则 <ul><li>系统存储过程 sp_bindrule  可以绑定一个规则到表的一个列或一个用户定义数据类型上。其语法格式如下: </li></ul><ul><ul><li>sp_bindr...
<ul><ul><li>EXEC sp_bindrule hire_date_rule, 'employee.hire_date' </li></ul></ul><ul><li>  运行结果为: </li></ul><ul><ul><li>已将...
<ul><ul><li>EXEC sp_addtype pat_char,'varchar(10)','NOT NULL' </li></ul></ul><ul><ul><li>GO </li></ul></ul><ul><ul><li>EXE...
<ul><ul><li>EXEC sp_bindrule sex_rule, 'employees.emp_sex' </li></ul></ul><ul><li>运行结果如下: </li></ul><ul><ul><li>已将规则绑定到表的列...
<ul><li>系统存储过程 sp_unbindrule 可解除规则与列或用户定义数据类型的绑定,其语法格式如下: </li></ul><ul><ul><li>sp_unbindrule [@objname =] 'object_name' <...
例 8-9  解除例 8-6 和例 8-7 绑定在 employees 表的 hire_date 列和用户定义数据类型 pat_char 上的规则。 <ul><ul><li>EXEC sp_unbindrule 'employees.hire_...
8.2.4  删除规则 <ul><li>使用 DROP RULE 语句删除当前数据库中的一个或多个规则。其语法格式如下: </li></ul><ul><ul><li>DROP RULE {rule_name} [,...n] </li></ul...
<ul><li>8.3.1  创建默认值 </li></ul><ul><li>8.3.2  查看默认值 </li></ul><ul><li>8.3.3  默认值的绑定与松绑 </li></ul><ul><li>8.3.4  删除默认值 </li...
8.3.1  创建默认值 <ul><li>默认值 (Default) 可以帮助处理不包括全部数据表字段的 Insert 操作。当在插入记录时没有指定字段的值时,将用默认值代替相应字段的值。 </li></ul><ul><li>默认值对象可以用于...
8.3.1  创建默认值 <ul><li>1 .用企业管理器创建默认值  </li></ul><ul><li>在企业管理器中选择数据库对象的“默认值”对象,单击右键,从快捷菜单中选择“新建默认值”选项,打开“默认属性”对话框,如图 8-7 所示...
2 .用 CREATE DEFAULT 语句创建默认值 <ul><li>CREATE DEFAULT 语句用于在当前数据库中创建默认值对象,其语法格式如下: </li></ul><ul><ul><li>CREATE DEFAULT defaul...
例、将上例中“工资”字段的默认值设为 “ 2000”, 名称为 de_salary <ul><li>Create default de_salary AS 2000 </li></ul><ul><li>GO  </li></ul><ul><li...
<ul><ul><li>例 8-11  创建生日默认值 birthday_defa 。 </li></ul></ul><ul><ul><li>CREATE DEFAULT birthday_defa </li></ul></ul><ul><ul...
<ul><li>1 .用企业管理器查看默认值 </li></ul><ul><li>在企业管理器中选择数据库对象的“默认值”对象,即可从右边的任务板中看到默认值的大部分信息,如图 8-8 所示。 </li></ul>8.3.2  查看默认值 8....
<ul><li>选择要查看的默认值,单击右键,从快捷菜单中选择“属性”选项,就会出现图 8-9 所示的“默认属性”对话框,可以从中编辑默认值的值表达式。 </li></ul>8.3.2  查看默认值
2 .用系统存储过程 sp_helptext  查看默认值 <ul><li>使用 sp_helptext 系统存储过程可以查看默认值的细节。 </li></ul><ul><li>例 8-13  查看默认值 today_defa 。 </li><...
8.3.3  默认值的绑定与松绑 <ul><li>1 .用企业管理器管理默认值的绑定和松绑 </li></ul><ul><li>在企业管理器中,选择要进行绑定设置的默认值,单击右键,从快捷菜单中选择“属性”选项,打开“默认属性”对话框,参见图 ...
<ul><li>单击“绑定列 (B)” 按钮,则出现如图 8-12 所示的“将绑定默认值到表的列”对话框。管理默认值与用户定义数据类型以及表的列之间的绑定和松绑与规则相同。 </li></ul>8.3.3  默认值的绑定与松绑
2 .用 sp_bindefault  绑定默认值 <ul><li>系统存储过程 sp_bindefault  可以绑定一个默认值到表的一个列或一个用户定义数据类型上。其语法格式如下: </li></ul><ul><ul><li>sp_bind...
例 8-14  绑定默认值 today_defa  到 employee 表的 hire_date 列上。 <ul><ul><li>EXEC sp_bindefault today_defa, 'employee.hire_date' </li...
3 .用 sp_unbindefault  解除默认值的绑定 <ul><li>系统存储过程 sp_unbindefault  可以解除默认值与表的列或用户定义数据类型的绑定,其语法格式如下: </li></ul><ul><ul><li>sp_u...
例 8-15  解除默认值 today_defa 与表 employee  的 hire_date  列的绑定。 <ul><ul><li>EXEC sp_unbindefault 'employee.hire_date' </li></ul><...
8.3.4  删除默认值 <ul><li>可以在企业管理器中选择默认值,单击右键,从快捷菜单中选择“删除”选项删除默认值,也可以使用 DROP DEFAULT 语句删除当前数据库中的一个或多个默认值。其语法格式如下: </li></ul><ul...
<ul><li>8.4.1  主键约束 </li></ul><ul><li>8.4.2  外键约束 </li></ul><ul><li>8.4.3  惟一性约束 </li></ul><ul><li>8.4.4  检查约束 </li></ul><...
8.4.1  主键约束 <ul><li>约束 (Constraint) 是 SQL Server 提供的自动保持数据库完整性的一种机制,它定义了可输入表或表的单个列中的数据的限制条件。使用约束优先于使用触发器、规则和默认值。 </li></ul...
主键 <ul><li>表的一列或几列的组合的值在表中惟一地指定一行记录,这样的一列或多列称为表的主键( Primary Key , PK ),通过它可强制表的实体完整性。 </li></ul><ul><li>主键不允许为空值,且不同两行的键值不...
<ul><li>定义列级主键约束的语法格式如下: </li></ul><ul><ul><li>[CONSTRAINT constraint_name] </li></ul></ul><ul><ul><li>PRIMARY KEY [CLUSTE...
例、创建项目表 project ,包含项目名称、项目编号、开始日期、项目负责人编号,设立项目编号为主键。 <ul><li>Create table project </li></ul><ul><li>( </li></ul><ul><li>项目...
例、将上例中的项目编号和项目名称设立为主键 <ul><li>Create table project </li></ul><ul><li>( </li></ul><ul><li>项目编号  char(8) not null, </li></ul...
例 8-17  在 employee 数据库中创建 customer 表,并声明主键约束。 <ul><ul><li>CREATE TABLE employee.dbo.customer </li></ul></ul><ul><ul><li>( ...
非聚集主键约束 <ul><li>若要定义 customer_id 列为非聚集主键约束,并指定约束名为 PK_customer ,使用以下语句:  </li></ul><ul><ul><li>customer_id char(5)  </li><...
例 8-18  创建一个产品信息表 goods ,将产品编号 goods_id 列声明为主键。 <ul><li>CREATE TABLE goods </li></ul><ul><li>( goods_id char(6)  NOT NULL,...
8.4.2  外键约束 <ul><li>外键约束定义了表与表之间的关系。当一个表中的一列或多列的组合与其他表中的主关键字定义相同时,就可以将这一列或多列定义为外关键字,可以使数据更新同步,也可拒绝违背参照完整性的数据插入到数据表中。通过外键约束...
<ul><li>例如, Sales 数据库中的 employee 、 sell_order 、 goods 这 3 个表之间存在以下逻辑联系:在 sell_order 表上应建立两个外键约束 FK_sell_order_employee 和 F...
级联操作 <ul><li>SQL Server 提供了两种级联操作以保证数据完整性: </li></ul><ul><ul><li>(1)  级联删除:确定当主键表中某行被删除时,外键表中所有相关行将被删除。 </li></ul></ul><ul...
外键约束与主键约束相同,也分为表约束与列约束。 <ul><li>定义表级外键约束的语法格式如下: </li></ul><ul><ul><li>[CONSTRAINT constraint_name] </li></ul></ul><ul><ul...
例、有员工信息表 employee 和项目表 project 如下所示: <ul><li>Create table employee </li></ul><ul><li>( </li></ul><ul><li>员工编号  char(4) not...
例、为项目表 project 的字段“负责人编号”建立外键约束,参照员工信息表 employee 的字段“员工编号” <ul><li>ALTER TABLE project </li></ul><ul><li>ADD CONSTRAINT fk...
例 8-20  创建一个订货表 sell_order1 ,与例 8-18 创建的产品表 goods1 相关联。 <ul><li>CREATE TABLE sell_order1 </li></ul><ul><li>( order_id1 cha...
<ul><li>CREATE TABLE sell_order2 </li></ul><ul><li>( order_id1 char(6) </li></ul><ul><li>PRIMARY KEY, </li></ul><ul><li>go...
<ul><li>employee_id 列的外键应当定义如下: </li></ul><ul><ul><li>CONSTRAINT FK_sell_order_employee /*  可省略  */ </li></ul></ul><ul><ul...
8.4.3  惟一性约束 <ul><li>惟一性 (Unique) 约束指定一个或多个列的组合的值具有惟一性,以确保在非主关键字段或字段组合中不输入重复的值,为表中的一列或者多列提供实体完整性。 </li></ul><ul><li>惟一性约束和...
<ul><li>定义列级惟一性约束的语法格式如下: </li></ul><ul><ul><li>[CONSTRAINT constraint_name] </li></ul></ul><ul><ul><li>UNIQUE [CLUSTERED ...
例、修改 employees 表,使字段 emp_cardid 具有惟一性 <ul><li>ALTER TABLE employees </li></ul><ul><li>ADD CONSTRAINT u_empcadid UNIQUE </l...
例、创建项目表 project ,包含项目名称、项目编号、项目负责人,设立项目编号为主键,主键约束名为 pk_pno ,为项目名称和项目负责人的字段组合设立惟一性约束,约束名为 u_pna_pm 。 <ul><li>Create table p...
8.4.4  检查约束 <ul><li>检查 (Check) 约束对输入列或整个表中的值设置检查条件,以限制输入值,保证数据库的数据完整性。 </li></ul><ul><li>当对具有检查约束列进行插入或修改时, SQL Server 将用该...
检查约束与外键约束的区别 <ul><li>外键约束是从另一个表中获得有效数值的列表 </li></ul><ul><li>检查约束基于逻辑表达式进行判断 </li></ul>
定义检查约束的语法格式: <ul><li>[CONSTRAINT constraint_name] </li></ul><ul><li>CHECK  [NOT FOR REPLICATION] </li></ul><ul><li>(logica...
例、创建一个数据表 employee2 ,包含 3 个字段:员工编号、员工姓名、工资,要求将 “员工编号”设置为主键,为字段“员工姓名”设置惟一性约束,限定“工资”字段的取值范围在 2000 ~ 5000 之间,检查约束名为 ck_sa 。 <...
例 8-24  更改表 employee2 以添加未验证检查约束。 <ul><li>ALTER TABLE employee2 </li></ul><ul><li>WITH NOCHECK </li></ul><ul><li>ADD CONST...
例 8-25  创建一个订货表 orders ,保证各订单的订货量必须不小于 10 。 <ul><li>CREATE TABLE orders </li></ul><ul><li>( order_id char(8), </li></ul><u...
<ul><li>CREATE TABLE transporters </li></ul><ul><li>( transporter_id char(4) NOT NULL, </li></ul><ul><li>transport_name va...
8.4.5  默认约束 <ul><li>默认 (Default) 约束通过定义列的默认值或使用数据库的默认值对象绑定表的列,以确保在没有为某列指定数据时,来指定列的值。 </li></ul><ul><li>默认值可以是常量,也可以是表达式,还可...
定义默认约束的语法格式 <ul><ul><li>[CONSTRAINT constraint_name] </li></ul></ul><ul><ul><li>DEFAULT constant_expression [FOR column_na...
<ul><ul><li>例 8-27  在 employee 数据库中,为员工表 employees 的 sex 列添加默认约束,默认值是“男”。 </li></ul></ul><ul><ul><li>ALTER TABLE employees...
例 8-29  添加具有默认值的可为空的列 <ul><ul><li>ALTER TABLE employees </li></ul></ul><ul><ul><li>ADD hire_date datetime </li></ul></ul><...
例 8-30  使用默认约束。 <ul><li>-- 创建表 purchase_order </li></ul><ul><li>CREATE TABLE purchase_order </li></ul><ul><li>( order_id2 ...
例 8-31  为表 purchase_orders 定义多个约束 <ul><li>CREATE TABLE purchase_orders </li></ul><ul><li>( order_id2 char(6) NOT NULL, </l...
本章小结 (1) 数据完整性有 4 种类型:实体完整性、域完整性、参照完整性和用户定义的完整性。在 SQL Server 2000 中可以通过各种约束、默认、规则和触发器等数据库对象来保证数据的完整性。 (2) 规则实施数据的完整性:规则就是数...
Upcoming SlideShare
Loading in...5
×

第8章 数据完整性

611

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
611
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
3
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

第8章 数据完整性

  1. 1. 第 8 章 数据完整性
  2. 2. 本章内容 <ul><li>8.1 数据完整性概述 </li></ul><ul><li>8.2 使用规则实施数据完整性 </li></ul><ul><li>8.3 使用默认值实施数据完整性 </li></ul><ul><li>8.4 使用约束实施数据完整性 </li></ul>
  3. 3. 8.1 数据完整性概述 <ul><li>完整性定义 </li></ul><ul><ul><li>数据完整性有 4 种类型: </li></ul></ul><ul><ul><li>实体完整性 (Entity Integrity) 、 </li></ul></ul><ul><ul><li>域完整性 (Domain Integrity) 、 </li></ul></ul><ul><ul><li>参照完整性 (Referential Integrity) 、 </li></ul></ul><ul><ul><li>用户定义的完整性 (User-defined Integrity) 。 </li></ul></ul><ul><li>完整性保障 </li></ul><ul><li>在 SQL Server 中可以通过各种规则 (Rule) 、默认 (Default) 、约束 (Constraint) 和触发器 (Trigger) 等数据库对象来保证数据的完整性。 </li></ul>
  4. 4. 8.2 使用规则实施数据完整性 <ul><li>8.2.1 创建规则 </li></ul><ul><li>8.2.2 查看和修改规则 </li></ul><ul><li>8.2.3 规则的绑定与松绑 </li></ul><ul><li>8.2.4 删除规则 </li></ul>
  5. 5. 8.2.1 创建规则 <ul><li>规则 (Rule) 是数据库中对存储在表中列的值或用户定义数据类型的规定和限制,它指定字段可接受哪些数据值。 </li></ul><ul><li>规则是单独存储的独立的数据库对象。 </li></ul><ul><li>规则和约束可以同时使用,表的列可以有一个规则及多个约束。规则与检查约束在功能上相似,但在使用上有所区别。 </li></ul>8.2 使用规则实施数据完整性
  6. 6. 8.2.1 创建规则 <ul><ul><li>检查约束是在 CREATE TABLE 或 ALTER TABLE 语句中定义的,嵌入了被定义的表结构,即删除表的时候检查约束也就随之被删除。 </li></ul></ul><ul><ul><li>而规则需要用 CREATE RULE 语句定义后才能使用,是独立于表之外的数据库对象,删除表并不能删除规则,需要用 DROP RULE 语句才能删除。 </li></ul></ul><ul><ul><li>相比之下,使用在 CREATE TABLE 或 ALTER TABLE 语句中定义的检查约束是更标准的限制列值的方法,但检查约束不能直接作用于用户定义数据类型。 </li></ul></ul>8.2 使用规则实施数据完整性
  7. 7. 例、创建一个数据表 employee1 ,包含 4 个字段:员工编号、员工姓名、职务、工资,要求将员工编号设置为主键,并创建一个规则 ru_salary ,将该规则绑定到表 employee 的“工资”字段上,限定该字段的值为 2000 ~ 10000. <ul><li>Create table employee1 </li></ul><ul><li>(empno char(4) not null PRIMARY KEY, </li></ul><ul><li>ename char(8), </li></ul><ul><li>eposition char(20), </li></ul><ul><li>salary int </li></ul><ul><li>) </li></ul><ul><li>GO </li></ul><ul><li>Create Rule ru_salary </li></ul><ul><li>AS @sa>=2000 and @sa<=10000 </li></ul><ul><li>GO </li></ul><ul><li>Exec Sp_bindrule 'ru_salary','employee1.salary' </li></ul>
  8. 8. 1 .用企业管理器创建规则 <ul><li>在企业管理器中选择数据库对象“规则”,单击右键从快捷菜单中选择“新建规则”选项,即会弹出如图所示的“规则属性”对话框。 </li></ul><ul><li>输入规则名称和表达式之后,单击“确定”按钮,即完成规则的创建。 </li></ul>8.2.1 创建规则
  9. 9. 2 .用 CREATE RULE 语句创建规则 <ul><li>CREATE RULE 语句用于在当前数据库中创建规则,其语法格式如下: </li></ul><ul><ul><li>CREATE RULE rule_name AS condition_expression </li></ul></ul>8.2.1 创建规则
  10. 10. <ul><ul><li>CREATE RULE hire_date_rule </li></ul></ul><ul><ul><li>AS @hire_date>='1980-01-01' and @hire_date<=getdate() </li></ul></ul><ul><li>例 8-2 创建性别规则 sex_rule 。 </li></ul><ul><ul><li>CREATE RULE sex_rule </li></ul></ul><ul><ul><li>AS @sex in (' 男 ',' 女 ') </li></ul></ul>例 8-1 创建雇佣日期规则 hire_date_rule 。 8.2.1 创建规则
  11. 11. <ul><ul><li>CREATE RULE grade_rule </li></ul></ul><ul><ul><li>AS @value between 1 and 100 </li></ul></ul><ul><li>例 8-4 创建字符规则 my_character_rule 。 </li></ul><ul><ul><li>Create rule my_character_rule </li></ul></ul><ul><ul><li>As @value like '[a-z]%[0-9]' </li></ul></ul>例 8-3 创建评分规则 grade_rule 。 8.2.1 创建规则
  12. 12. <ul><li>1 .用企业管理器查看和修改规则 </li></ul><ul><li>在企业管理器的数据库对象中选择“规则”对象,即可从右边的任务板中看到规则的大部分信息,包括规则的名称、所有者、创建时间等。 </li></ul>8.2.2 查看和修改规则 8.2 使用规则实施数据完整性
  13. 13. <ul><li>使用 sp_helptext 系统存储过程可以查看规则的文本信息。 </li></ul><ul><li>例 8-5 查看规则 hire_date_rule 的文本信息 </li></ul><ul><ul><li>EXECUTE sp_helptext hire_date_rule </li></ul></ul><ul><ul><li>运行结果如图所示 </li></ul></ul>2 .用系统存储过程 sp_helptext 查看规则 8.2.2 查看和修改规则
  14. 14. 8.2.3 规则的绑定与松绑 <ul><li>需要将规则与数据库表或用户定义对象联系起来,才能发生作用。联系的方法称为绑定,所谓绑定就是指定规则作用于哪个表的哪一列或哪个用户定义数据类型。 </li></ul><ul><li>表的一列或一个用户定义数据类型只能与一个规则相绑定,而一个规则可以绑定多个对象。 </li></ul><ul><li>解除规则与对象的绑定称为松绑。 </li></ul>8.2 使用规则实施数据完整性
  15. 15. <ul><li>在企业管理器中,展开数据库( Sales )文件夹,鼠标单击“规则”选项,在右窗格中选择要进行绑定的规则( hire_date ),单击鼠标右键,从快捷菜单中选择“属性” 菜单项,打开“规则属性”对话框,如图 8-4 所示。 </li></ul><ul><li>图中的“绑定 UDT(U)” 按钮用于绑定规则到用户定义的数据类型,“绑定列 (B)” 按钮用于绑定规则到表的列。 </li></ul>1 .用企业管理器管理规则的绑定和松绑 8.2.3 规则的绑定与松绑
  16. 16. <ul><li>在图 8-4 中单击“绑定 UDT(U)” 按钮,则出现“将绑定规则到用户定义的数据类型”对话框,如图 8-5 所示; </li></ul>8.2.3 规则的绑定与松绑
  17. 17. <ul><li>单击“绑定列 (B)” 按钮,则出现如图 8-6 所示的“将绑定规则到列”对话框。 </li></ul><ul><li>在“将规则绑定列”对话框的左边“未绑定的列”列表框中选择一列“添加”到右边“绑定列”列表框中,就实现规则绑定了。 </li></ul><ul><li>同样,去掉“将规则绑定到用户定义的数据类型”对话框的列表框的“绑定”列下的标识或删除“将规则绑定列”对话框的右边“绑定列”列表框的列,就实现了规则的松绑操作。 </li></ul>8.2.3 规则的绑定与松绑
  18. 18. 2 .用系统存储过程 sp_bindrule 绑定规则 <ul><li>系统存储过程 sp_bindrule 可以绑定一个规则到表的一个列或一个用户定义数据类型上。其语法格式如下: </li></ul><ul><ul><li>sp_bindrule [@rulename =] 'rule', </li></ul></ul><ul><ul><li>[@objname =] 'object_name' </li></ul></ul><ul><ul><li>[ , [ @futureonly=] 'futureonly' ] </li></ul></ul>8.2.3 规则的绑定与松绑
  19. 19. <ul><ul><li>EXEC sp_bindrule hire_date_rule, 'employee.hire_date' </li></ul></ul><ul><li> 运行结果为: </li></ul><ul><ul><li>已将规则绑定到表的列上。 </li></ul></ul>例 8-6 将例 8-1 创建的规则 hire_date_rule 绑定到 employee 表的 hire_date 列上。 8.2.3 规则的绑定与松绑
  20. 20. <ul><ul><li>EXEC sp_addtype pat_char,'varchar(10)','NOT NULL' </li></ul></ul><ul><ul><li>GO </li></ul></ul><ul><ul><li>EXEC sp_bindrule my_character_rule, pat_char, 'futureonly‘ </li></ul></ul><ul><li>运行结果如下: </li></ul><ul><ul><li>(所影响的行数为 1 行) </li></ul></ul><ul><ul><li>类型已添加。 </li></ul></ul><ul><ul><li>已将规则绑定到数据类型。 </li></ul></ul>例 8-7 定义用户定义数据类型 pat_char ,将例 8-4 创建的规则 my_character_rule 绑定到 pat_char 上。 8.2.3 规则的绑定与松绑
  21. 21. <ul><ul><li>EXEC sp_bindrule sex_rule, 'employees.emp_sex' </li></ul></ul><ul><li>运行结果如下: </li></ul><ul><ul><li>已将规则绑定到表的列上。 </li></ul></ul>例 8-8 绑定例 8-2 创建的规则 sex_rule 到 employees 表的字段 emp_sex 上。 8.2.3 规则的绑定与松绑
  22. 22. <ul><li>系统存储过程 sp_unbindrule 可解除规则与列或用户定义数据类型的绑定,其语法格式如下: </li></ul><ul><ul><li>sp_unbindrule [@objname =] 'object_name' </li></ul></ul><ul><ul><li>[ , [ @futureonly = ] 'futureonly' ] </li></ul></ul>3 .用系统存储过程 sp_unbindrule 解除规则的绑定 8.2.3 规则的绑定与松绑
  23. 23. 例 8-9 解除例 8-6 和例 8-7 绑定在 employees 表的 hire_date 列和用户定义数据类型 pat_char 上的规则。 <ul><ul><li>EXEC sp_unbindrule 'employees.hire_date' </li></ul></ul><ul><li>运行结果如下: </li></ul><ul><ul><li>(所影响的行数为 1 行) </li></ul></ul><ul><ul><li>已从表的列上解除了规则的绑定。 </li></ul></ul><ul><ul><li>EXEC sp_unbindrule pat_char,'futureonly' </li></ul></ul><ul><li>运行结果如下: </li></ul><ul><ul><li>(所影响的行数为 1 行) </li></ul></ul><ul><ul><li>已从数据类型上解除了规则的绑定。 </li></ul></ul>8.2.3 规则的绑定与松绑
  24. 24. 8.2.4 删除规则 <ul><li>使用 DROP RULE 语句删除当前数据库中的一个或多个规则。其语法格式如下: </li></ul><ul><ul><li>DROP RULE {rule_name} [,...n] </li></ul></ul><ul><li>注意:在删除一个规则前,必须先将与其绑定的对象解除绑定。 </li></ul><ul><li>例 8-10 删除例 8-1 和 8-2 中创建的规则。 </li></ul><ul><ul><li>DROP RULE sex_rule,hire_date_rule </li></ul></ul>8.2 使用规则实施数据完整性
  25. 25. <ul><li>8.3.1 创建默认值 </li></ul><ul><li>8.3.2 查看默认值 </li></ul><ul><li>8.3.3 默认值的绑定与松绑 </li></ul><ul><li>8.3.4 删除默认值 </li></ul>8.3 使用默认值实施数据完整性
  26. 26. 8.3.1 创建默认值 <ul><li>默认值 (Default) 可以帮助处理不包括全部数据表字段的 Insert 操作。当在插入记录时没有指定字段的值时,将用默认值代替相应字段的值。 </li></ul><ul><li>默认值对象可以用于多个列或用户定义数据类型。表的一列或一个用户定义数据类型只能与一个默认值相绑定。 </li></ul><ul><li>默认值的创建、查看、绑定、松绑和删除等操作可在企业管理器中进行,也可利用 Transact-SQL 语句进行。 </li></ul>8.3 使用默认值实施数据完整性
  27. 27. 8.3.1 创建默认值 <ul><li>1 .用企业管理器创建默认值 </li></ul><ul><li>在企业管理器中选择数据库对象的“默认值”对象,单击右键,从快捷菜单中选择“新建默认值”选项,打开“默认属性”对话框,如图 8-7 所示。输入默认值名称和值表达式之后,单击“确定”按钮,即完成默认值的创建。 </li></ul>8.3.1 创建默认值
  28. 28. 2 .用 CREATE DEFAULT 语句创建默认值 <ul><li>CREATE DEFAULT 语句用于在当前数据库中创建默认值对象,其语法格式如下: </li></ul><ul><ul><li>CREATE DEFAULT default_name </li></ul></ul><ul><ul><li>AS constant_expression </li></ul></ul>8.3.1 创建默认值
  29. 29. 例、将上例中“工资”字段的默认值设为 “ 2000”, 名称为 de_salary <ul><li>Create default de_salary AS 2000 </li></ul><ul><li>GO </li></ul><ul><li>Exec sp_bindefault ‘de_salary’, ‘employee1.salary’ </li></ul>
  30. 30. <ul><ul><li>例 8-11 创建生日默认值 birthday_defa 。 </li></ul></ul><ul><ul><li>CREATE DEFAULT birthday_defa </li></ul></ul><ul><ul><li>AS '1978-1-1' </li></ul></ul><ul><li>例 8-12 创建当前日期默认值 today_defa 。 </li></ul><ul><ul><li>CREATE DEFAULT today_defa </li></ul></ul><ul><ul><li>AS getdate() </li></ul></ul>8.3.1 创建默认值
  31. 31. <ul><li>1 .用企业管理器查看默认值 </li></ul><ul><li>在企业管理器中选择数据库对象的“默认值”对象,即可从右边的任务板中看到默认值的大部分信息,如图 8-8 所示。 </li></ul>8.3.2 查看默认值 8.3 使用默认值实施数据完整性
  32. 32. <ul><li>选择要查看的默认值,单击右键,从快捷菜单中选择“属性”选项,就会出现图 8-9 所示的“默认属性”对话框,可以从中编辑默认值的值表达式。 </li></ul>8.3.2 查看默认值
  33. 33. 2 .用系统存储过程 sp_helptext 查看默认值 <ul><li>使用 sp_helptext 系统存储过程可以查看默认值的细节。 </li></ul><ul><li>例 8-13 查看默认值 today_defa 。 </li></ul><ul><ul><li>EXEC sp_helptext today_defa </li></ul></ul><ul><li>运行结果如图 8-10 所示。 </li></ul>8.3.2 查看默认值
  34. 34. 8.3.3 默认值的绑定与松绑 <ul><li>1 .用企业管理器管理默认值的绑定和松绑 </li></ul><ul><li>在企业管理器中,选择要进行绑定设置的默认值,单击右键,从快捷菜单中选择“属性”选项,打开“默认属性”对话框,参见图 8-9 。 </li></ul><ul><li>图 8-9 中的“绑定 UDT(U)” 按钮用于将默认值绑定到用户定义数据类型,“绑定列 (B)” 按钮用于将默认值绑定到表的列。单击“绑定 UDT(U)” 按钮,则出现如图 8-11 所示的“将绑定默认值到用户定义的数据类型”对话框 </li></ul>8.3 使用默认值实施数据完整性
  35. 35. <ul><li>单击“绑定列 (B)” 按钮,则出现如图 8-12 所示的“将绑定默认值到表的列”对话框。管理默认值与用户定义数据类型以及表的列之间的绑定和松绑与规则相同。 </li></ul>8.3.3 默认值的绑定与松绑
  36. 36. 2 .用 sp_bindefault 绑定默认值 <ul><li>系统存储过程 sp_bindefault 可以绑定一个默认值到表的一个列或一个用户定义数据类型上。其语法格式如下: </li></ul><ul><ul><li>sp_bindefault [@defname =] 'default', </li></ul></ul><ul><ul><li>[@objname =] 'object_name' </li></ul></ul><ul><ul><li>[ , [ @futureonly=] 'futureonly' ] </li></ul></ul>8.3.3 默认值的绑定与松绑
  37. 37. 例 8-14 绑定默认值 today_defa 到 employee 表的 hire_date 列上。 <ul><ul><li>EXEC sp_bindefault today_defa, 'employee.hire_date' </li></ul></ul><ul><li>运行结果如下: </li></ul><ul><ul><li>已将默认值绑定到列。 </li></ul></ul>8.3.3 默认值的绑定与松绑
  38. 38. 3 .用 sp_unbindefault 解除默认值的绑定 <ul><li>系统存储过程 sp_unbindefault 可以解除默认值与表的列或用户定义数据类型的绑定,其语法格式如下: </li></ul><ul><ul><li>sp_unbindefault [@objname =] 'object_name' </li></ul></ul><ul><ul><li>[ , [ @futureonly=] 'futureonly' ] </li></ul></ul>8.3.3 默认值的绑定与松绑
  39. 39. 例 8-15 解除默认值 today_defa 与表 employee 的 hire_date 列的绑定。 <ul><ul><li>EXEC sp_unbindefault 'employee.hire_date' </li></ul></ul><ul><li>运行结果如下: </li></ul><ul><ul><li>(所影响的行数为 1 行) </li></ul></ul><ul><ul><li>已从表的列上解除了默认值的绑定。 </li></ul></ul>8.3.3 默认值的绑定与松绑
  40. 40. 8.3.4 删除默认值 <ul><li>可以在企业管理器中选择默认值,单击右键,从快捷菜单中选择“删除”选项删除默认值,也可以使用 DROP DEFAULT 语句删除当前数据库中的一个或多个默认值。其语法格式如下: </li></ul><ul><ul><li>DROP DEFAULT {default_name} [,...n] </li></ul></ul><ul><li>例 8-16 删除生日默认值 birthday_defa 。 </li></ul><ul><ul><li>DROP DEFAULT birthday_defa </li></ul></ul>8.3 使用默认值实施数据完整性
  41. 41. <ul><li>8.4.1 主键约束 </li></ul><ul><li>8.4.2 外键约束 </li></ul><ul><li>8.4.3 惟一性约束 </li></ul><ul><li>8.4.4 检查约束 </li></ul><ul><li>8.4.5 默认约束 </li></ul>8.4 使用约束实施数据完整性
  42. 42. 8.4.1 主键约束 <ul><li>约束 (Constraint) 是 SQL Server 提供的自动保持数据库完整性的一种机制,它定义了可输入表或表的单个列中的数据的限制条件。使用约束优先于使用触发器、规则和默认值。 </li></ul><ul><li>约束独立于表结构,作为数据库定义部分在 CREATE TABLE 语句中声明,可以在不改变表结构的基础上,通过 ALTER TABLE 语句添加或删除。当表被删除时,表所带的所有约束定义也随之被删除。 </li></ul>8.4 使用约束实施数据完整性
  43. 43. 主键 <ul><li>表的一列或几列的组合的值在表中惟一地指定一行记录,这样的一列或多列称为表的主键( Primary Key , PK ),通过它可强制表的实体完整性。 </li></ul><ul><li>主键不允许为空值,且不同两行的键值不能相同。表中可以有不止一个键惟一标识行,每个键都称为侯选键,只可以选一个侯选键作为表的主键,其他侯选键称作备用键。 </li></ul><ul><li>如果一个表的主键由单列组成,则该主键约束可以定义为该列的列约束。如果主键由两个以上的列组成,则该主键约束必须定义为表约束。 </li></ul>8.4.1 主键约束
  44. 44. <ul><li>定义列级主键约束的语法格式如下: </li></ul><ul><ul><li>[CONSTRAINT constraint_name] </li></ul></ul><ul><ul><li>PRIMARY KEY [CLUSTERED | NONCLUSTERED] </li></ul></ul><ul><li>定义表级主键约束的语法格式如下: </li></ul><ul><ul><li>[CONSTRAINT constraint_name] </li></ul></ul><ul><ul><li>PRIMARY KEY [CLUSTERED | NONCLUSTERED] </li></ul></ul><ul><ul><li>{ (column_name [, … n ] )} </li></ul></ul>8.4.1 主键约束
  45. 45. 例、创建项目表 project ,包含项目名称、项目编号、开始日期、项目负责人编号,设立项目编号为主键。 <ul><li>Create table project </li></ul><ul><li>( </li></ul><ul><li>项目编号 char(8) not null primary key, </li></ul><ul><li>项目名称 varchar(30), </li></ul><ul><li>开始日期 datetime, </li></ul><ul><li>负责人编号 char(4) </li></ul><ul><li>) </li></ul>
  46. 46. 例、将上例中的项目编号和项目名称设立为主键 <ul><li>Create table project </li></ul><ul><li>( </li></ul><ul><li>项目编号 char(8) not null, </li></ul><ul><li>项目名称 varchar(30), </li></ul><ul><li>项目负责人 char(8) , </li></ul><ul><li>Constraint pk_pno_pname primary key (项目编号,项目名称) </li></ul><ul><li>) </li></ul>
  47. 47. 例 8-17 在 employee 数据库中创建 customer 表,并声明主键约束。 <ul><ul><li>CREATE TABLE employee.dbo.customer </li></ul></ul><ul><ul><li>( customer_id bigint NOT NULL </li></ul></ul><ul><ul><li>IDENTITY(1,1) PRIMARY KEY, </li></ul></ul><ul><ul><li>customer_name varchar(50) NOT NULL, </li></ul></ul><ul><ul><li>linkman_name char(8), </li></ul></ul><ul><ul><li>address varchar(50), </li></ul></ul><ul><ul><li>telephone char(12) </li></ul></ul><ul><ul><li>) </li></ul></ul><ul><ul><li>IDENTITY(1,1) : 初值为 1 ,增量为 1 </li></ul></ul>8.4.1 主键约束
  48. 48. 非聚集主键约束 <ul><li>若要定义 customer_id 列为非聚集主键约束,并指定约束名为 PK_customer ,使用以下语句: </li></ul><ul><ul><li>customer_id char(5) </li></ul></ul><ul><ul><li>CONSTRAINT PK_customer PRIMARY KEY NONCLUSTERED </li></ul></ul>8.4.1 主键约束
  49. 49. 例 8-18 创建一个产品信息表 goods ,将产品编号 goods_id 列声明为主键。 <ul><li>CREATE TABLE goods </li></ul><ul><li>( goods_id char(6) NOT NULL, </li></ul><ul><li>goods_name varchar(50) NOT NULL, </li></ul><ul><li>classification_id char(6) NOT NULL, </li></ul><ul><li>unit_price money NOT NULL, </li></ul><ul><li>stock_quantity float NOT NULL, </li></ul><ul><li>order_quantity float NULL </li></ul><ul><li>CONSTRAINT pk_p_id PRIMARY KEY (goods_id) </li></ul><ul><li>) </li></ul>8.4.1 主键约束
  50. 50. 8.4.2 外键约束 <ul><li>外键约束定义了表与表之间的关系。当一个表中的一列或多列的组合与其他表中的主关键字定义相同时,就可以将这一列或多列定义为外关键字,可以使数据更新同步,也可拒绝违背参照完整性的数据插入到数据表中。通过外键约束可以强制参照完整性。 </li></ul>8.4 使用约束实施数据完整性
  51. 51. <ul><li>例如, Sales 数据库中的 employee 、 sell_order 、 goods 这 3 个表之间存在以下逻辑联系:在 sell_order 表上应建立两个外键约束 FK_sell_order_employee 和 FK_sell_order_goods, sell_order 表 employee_id 列和 goods_id 列的值必须分别来自 employee 表的 employee_id 列及 goods 表的 goods_id 列。 </li></ul><ul><li>企业管理器中建立约束:数据库—关系图 </li></ul>8.4.2 外键约束
  52. 52. 级联操作 <ul><li>SQL Server 提供了两种级联操作以保证数据完整性: </li></ul><ul><ul><li>(1) 级联删除:确定当主键表中某行被删除时,外键表中所有相关行将被删除。 </li></ul></ul><ul><ul><li>(2) 级联修改:确定当主键表中某行的键值被修改时,外键表中所有相关行的该外键值也将被自动修改为新值。 </li></ul></ul>8.4.2 外键约束
  53. 53. 外键约束与主键约束相同,也分为表约束与列约束。 <ul><li>定义表级外键约束的语法格式如下: </li></ul><ul><ul><li>[CONSTRAINT constraint_name] </li></ul></ul><ul><ul><li>FOREIGN KEY (column_name [, … n ]) </li></ul></ul><ul><ul><li>REFERENCES ref_table [(ref_column [, … n] )] </li></ul></ul><ul><ul><li>[ ON DELETE { CASCADE | NO ACTION } ] </li></ul></ul><ul><ul><li>[ ON UPDATE { CASCADE | NO ACTION } ] ] </li></ul></ul><ul><ul><li>[ NOT FOR REPLICATION ] </li></ul></ul><ul><ul><li>注: CASCADE 级连操作, NO ACTION :默认值,报错并回滚操作 </li></ul></ul><ul><li>定义列级外键约束的语法格式如下: </li></ul><ul><ul><li>[CONSTRAINT constraint_name] </li></ul></ul><ul><ul><li>[FOREIGN KEY] </li></ul></ul><ul><ul><li>REFERENCES ref_table </li></ul></ul><ul><ul><li>[ NOT FOR REPLICATION ] </li></ul></ul><ul><ul><li>注: NOT FOR REPLICATION 插入从其他表复制的数据时,约束无效 </li></ul></ul>8.4.2 外键约束
  54. 54. 例、有员工信息表 employee 和项目表 project 如下所示: <ul><li>Create table employee </li></ul><ul><li>( </li></ul><ul><li>员工编号 char(4) not null primary key, </li></ul><ul><li>员工姓名 varchar(8), </li></ul><ul><li>职务 char(20), </li></ul><ul><li>工资 int </li></ul><ul><li>) </li></ul><ul><li>Create table project </li></ul><ul><li>( </li></ul><ul><li>项目编号 char(8) not null primary key, </li></ul><ul><li>项目名称 varchar(30), </li></ul><ul><li>开始日期 datetime, </li></ul><ul><li>负责人编号 char(4) </li></ul><ul><li>) </li></ul>
  55. 55. 例、为项目表 project 的字段“负责人编号”建立外键约束,参照员工信息表 employee 的字段“员工编号” <ul><li>ALTER TABLE project </li></ul><ul><li>ADD CONSTRAINT fk_pro_emp FOREIGN KEY( 负责人编号 ) REFERENCES employee( 员工编号 ) ON DELETE CASCADE ON UPDATE CASCADE </li></ul>
  56. 56. 例 8-20 创建一个订货表 sell_order1 ,与例 8-18 创建的产品表 goods1 相关联。 <ul><li>CREATE TABLE sell_order1 </li></ul><ul><li>( order_id1 char(6) NOT NULL, </li></ul><ul><li>goods_id char(6) NOT NULL, </li></ul><ul><li>employee_id char(4) NOT NULL, </li></ul><ul><li>customer_id char(4) NOT NULL, </li></ul><ul><li>transporter_id char(4) NOT NULL, </li></ul><ul><li>order_num float NULL, </li></ul><ul><li>discount float NULL, </li></ul><ul><li>order_date datetime NOT NULL, </li></ul><ul><li>send_date datetime NULL, </li></ul><ul><li>arrival_date datetime NULL, </li></ul><ul><li>cost money NULL, </li></ul><ul><li>CONSTRAINT pk_order_id PRIMARY KEY (order_id1), </li></ul><ul><li>FOREIGN KEY (goods_id) REFERENCES goods1(goods_id) </li></ul><ul><li>) </li></ul>8.4.2 外键约束
  57. 57. <ul><li>CREATE TABLE sell_order2 </li></ul><ul><li>( order_id1 char(6) </li></ul><ul><li>PRIMARY KEY, </li></ul><ul><li>goods_id char(6) NOT NULL </li></ul><ul><li>CONSTRAINT FK_goods_id </li></ul><ul><li>FOREIGN KEY (goods_id) REFERENCES Goods1(goods_id) </li></ul><ul><li>ON DELETE NO ACTION </li></ul><ul><li>ON UPDATE CASCADE, </li></ul><ul><li>employee_id char(4) NOT NULL </li></ul><ul><li>CONSTRAINT FK_employee_id </li></ul><ul><li>FOREIGN KEY (employee_id) REFERENCES employee(employee_id) </li></ul><ul><li>ON UPDATE CASCADE, </li></ul><ul><li>customer_id char(4) NOT NULL, </li></ul><ul><li>transporter_id char(4) NOT NULL, </li></ul><ul><li>order_num float, </li></ul><ul><li>discount float, </li></ul><ul><li>order_date datetime NOT NULL, </li></ul><ul><li>send_date datetime, </li></ul><ul><li>arrival_date datetime, </li></ul><ul><li>cost money, </li></ul><ul><li>CONSTRAINT FK_customer_id </li></ul><ul><li>FOREIGN KEY (customer_id) REFERENCES customer(customer_id)) </li></ul>例 8-21 创建表 sell_order2 ,并为 goods_id 、 employee_id 、 custom_id 三列定义外键约束。 8.4.2 外键约束
  58. 58. <ul><li>employee_id 列的外键应当定义如下: </li></ul><ul><ul><li>CONSTRAINT FK_sell_order_employee /* 可省略 */ </li></ul></ul><ul><ul><li>FOREIGN KEY (department_id,employee_id) </li></ul></ul><ul><ul><li>REFERENCES employee(department_id,employee_id) </li></ul></ul>例如,如果 employee 表的主键是由 department_id 和 employee_id 组成的复合主键,则 sell_order 表中应增加相同类型的 department_id 列定义 8.4.2 外键约束
  59. 59. 8.4.3 惟一性约束 <ul><li>惟一性 (Unique) 约束指定一个或多个列的组合的值具有惟一性,以确保在非主关键字段或字段组合中不输入重复的值,为表中的一列或者多列提供实体完整性。 </li></ul><ul><li>惟一性约束和主键约束的区别: </li></ul><ul><ul><li>在一个表中只能定义一个主键约束,但可以定义多个惟一性约束 </li></ul></ul><ul><ul><li>允许空值的字段上不能定义主键约束,但可以定义惟一性约束 </li></ul></ul>8.4 使用约束实施数据完整性
  60. 60. <ul><li>定义列级惟一性约束的语法格式如下: </li></ul><ul><ul><li>[CONSTRAINT constraint_name] </li></ul></ul><ul><ul><li>UNIQUE [CLUSTERED | NONCLUSTERED] </li></ul></ul><ul><li>惟一性约束应用于多列时的定义格式: </li></ul><ul><ul><li>[CONSTRAINT constraint_name] </li></ul></ul><ul><ul><li>UNIQUE [CLUSTERED | NONCLUSTERED] </li></ul></ul><ul><ul><li>(column_name [, … n ]) </li></ul></ul>8.4.3 惟一性约束
  61. 61. 例、修改 employees 表,使字段 emp_cardid 具有惟一性 <ul><li>ALTER TABLE employees </li></ul><ul><li>ADD CONSTRAINT u_empcadid UNIQUE </li></ul><ul><li>(emp_cardid) </li></ul>8.4.3 惟一性约束
  62. 62. 例、创建项目表 project ,包含项目名称、项目编号、项目负责人,设立项目编号为主键,主键约束名为 pk_pno ,为项目名称和项目负责人的字段组合设立惟一性约束,约束名为 u_pna_pm 。 <ul><li>Create table project </li></ul><ul><li>( </li></ul><ul><li>项目编号 char(8) constraint pk_pno primary key, </li></ul><ul><li>项目名称 varchar(30), </li></ul><ul><li>项目负责人 char(8), </li></ul><ul><li>constraint u_pna_pm UNIQUE( 项目名称 , 项目负责人 ) </li></ul><ul><li>) </li></ul>
  63. 63. 8.4.4 检查约束 <ul><li>检查 (Check) 约束对输入列或整个表中的值设置检查条件,以限制输入值,保证数据库的数据完整性。 </li></ul><ul><li>当对具有检查约束列进行插入或修改时, SQL Server 将用该检查约束的逻辑表达式对新值进行检查,只有满足条件 ( 逻辑表达式返回 TRUE) 的值才能填入该列,否则报错。可以为每列指定多个 CHECK 约束。 </li></ul>8.4 使用约束实施数据完整性
  64. 64. 检查约束与外键约束的区别 <ul><li>外键约束是从另一个表中获得有效数值的列表 </li></ul><ul><li>检查约束基于逻辑表达式进行判断 </li></ul>
  65. 65. 定义检查约束的语法格式: <ul><li>[CONSTRAINT constraint_name] </li></ul><ul><li>CHECK [NOT FOR REPLICATION] </li></ul><ul><li>(logical_expression) </li></ul>8.4.4 检查约束
  66. 66. 例、创建一个数据表 employee2 ,包含 3 个字段:员工编号、员工姓名、工资,要求将 “员工编号”设置为主键,为字段“员工姓名”设置惟一性约束,限定“工资”字段的取值范围在 2000 ~ 5000 之间,检查约束名为 ck_sa 。 <ul><li>Create table employee2 </li></ul><ul><li>(empno char(4) not null PRIMARY KEY, </li></ul><ul><li>ename char(8) UNIQUE, </li></ul><ul><li>salary int NOT NULL Constraint ck_sa </li></ul><ul><li>Check(salary>=2000 and salary<=5000) </li></ul><ul><li>) </li></ul>
  67. 67. 例 8-24 更改表 employee2 以添加未验证检查约束。 <ul><li>ALTER TABLE employee2 </li></ul><ul><li>WITH NOCHECK </li></ul><ul><li>ADD CONSTRAINT CK_Age </li></ul><ul><li>CHECK (DATEDIFF(year, Birth_Date, Hire_Date)>18) </li></ul><ul><li>注: WITH NOCHECK 现有记录不验证约束 </li></ul>8.4.4 检查约束
  68. 68. 例 8-25 创建一个订货表 orders ,保证各订单的订货量必须不小于 10 。 <ul><li>CREATE TABLE orders </li></ul><ul><li>( order_id char(8), </li></ul><ul><li>p_id char(8), </li></ul><ul><li>p_name char(10) , </li></ul><ul><li>quantity smallint </li></ul><ul><li>CONSTRAINT chk_quantity CHECK (quantity>=10), </li></ul><ul><li>CONSTRAINT pk_orders_id PRIMARY KEY (order_id) </li></ul><ul><li>) </li></ul>8.4.4 检查约束
  69. 69. <ul><li>CREATE TABLE transporters </li></ul><ul><li>( transporter_id char(4) NOT NULL, </li></ul><ul><li>transport_name varchar(50), </li></ul><ul><li>linkman_name char(8), </li></ul><ul><li>address varchar(50), </li></ul><ul><li>telephone char(12) NOT NULL </li></ul><ul><li>CHECK(telephone LIKE </li></ul><ul><li>'0[1-9][0-9][0-9]-[1-9][0-9][0-9][0-9][0-9][0-9][0-9]' </li></ul><ul><li>OR telephone LIKE </li></ul><ul><li>'0[1-9][0-9]-[1-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]') </li></ul><ul><li>) </li></ul>例 8-26 创建 transporters 表并定义检查约束 8.4.4 检查约束
  70. 70. 8.4.5 默认约束 <ul><li>默认 (Default) 约束通过定义列的默认值或使用数据库的默认值对象绑定表的列,以确保在没有为某列指定数据时,来指定列的值。 </li></ul><ul><li>默认值可以是常量,也可以是表达式,还可以为 NULL 值。 </li></ul>8.4 使用约束实施数据完整性
  71. 71. 定义默认约束的语法格式 <ul><ul><li>[CONSTRAINT constraint_name] </li></ul></ul><ul><ul><li>DEFAULT constant_expression [FOR column_name] </li></ul></ul>8.4.5 默认约束
  72. 72. <ul><ul><li>例 8-27 在 employee 数据库中,为员工表 employees 的 sex 列添加默认约束,默认值是“男”。 </li></ul></ul><ul><ul><li>ALTER TABLE employees </li></ul></ul><ul><ul><li>ADD CONSTRAINT sex_default DEFAULT ' 男 ' FOR sex </li></ul></ul><ul><li>例 8-28 更改表 employee 为 hire_date 列定义默认约束。 </li></ul><ul><ul><li>ALTER TABLE employees </li></ul></ul><ul><ul><li>ADD CONSTRAINT hire_date_df DEFAULT (getdate()) </li></ul></ul><ul><ul><li>FOR hire_date </li></ul></ul>8.4.5 默认约束
  73. 73. 例 8-29 添加具有默认值的可为空的列 <ul><ul><li>ALTER TABLE employees </li></ul></ul><ul><ul><li>ADD hire_date datetime </li></ul></ul><ul><ul><li>DEFAULT (getdate()) WITH VALUES </li></ul></ul><ul><ul><li>注: WITH VALUES 现有每行都用默认值,否则该值为空 NULL </li></ul></ul>8.4.5 默认约束
  74. 74. 例 8-30 使用默认约束。 <ul><li>-- 创建表 purchase_order </li></ul><ul><li>CREATE TABLE purchase_order </li></ul><ul><li>( order_id2 char(6)NOT NULL, </li></ul><ul><li>goods_id char(6) NOT NULL, </li></ul><ul><li>employee_id char(4) NOT NULL, </li></ul><ul><li>supplier_id char(5) NOT NULL, </li></ul><ul><li>transporter_id char(4), </li></ul><ul><li>order_num float NOT NULL, </li></ul><ul><li>discount float </li></ul><ul><li>DEFAULT (0), </li></ul><ul><li>order_date datetime NOT NULL </li></ul><ul><li>DEFAULT (GetDate()), </li></ul><ul><li>send_date datetime, </li></ul><ul><li>arrival_date datetime) </li></ul><ul><li>-- 使用 DEFAULT VALUES 选项为 purchase_order 表装载数据。 </li></ul><ul><li>INSERT INTO purchase_order </li></ul><ul><li>DEFAULT VALUES </li></ul>8.4.5 默认约束
  75. 75. 例 8-31 为表 purchase_orders 定义多个约束 <ul><li>CREATE TABLE purchase_orders </li></ul><ul><li>( order_id2 char(6) NOT NULL, </li></ul><ul><li>goods_id char(6) NOT NULL, </li></ul><ul><li>employee_id char(4) NOT NULL, </li></ul><ul><li>supplier_id char(5) NOT NULL, </li></ul><ul><li>transporter_id char(4), </li></ul><ul><li>order_num float NOT NULL, </li></ul><ul><li>discount float </li></ul><ul><li>CHECK (discount>=0 AND discount<=50) </li></ul><ul><li>DEFAULT (0), </li></ul><ul><li>order_date datetime NOT NULL </li></ul><ul><li>DEFAULT (GetDate()), </li></ul><ul><li>send_date datetime, </li></ul><ul><li>arrival_date datetime, </li></ul><ul><li>CONSTRAINT CK_Send_date </li></ul><ul><li>CHECK (send_date > order_date), </li></ul><ul><li>CHECK (arrival_date > send_date) </li></ul><ul><li>) </li></ul>8.4.5 默认约束
  76. 76. 本章小结 (1) 数据完整性有 4 种类型:实体完整性、域完整性、参照完整性和用户定义的完整性。在 SQL Server 2000 中可以通过各种约束、默认、规则和触发器等数据库对象来保证数据的完整性。 (2) 规则实施数据的完整性:规则就是数据库中对存储在表的列或用户定义数据类型中的值的规定和限制。可以通过企业管理器和 Transact-SQL 语句来创建、删除、查看规则以及规则的绑定与松绑。 (3) 默认值实施数据完整性:默认值是用户输入记录时没有指定具体数据的列中自动插入的数据。默认值对象可以用于多个列或用户定义数据类型,它的管理与应用同规则有许多相似之处。表的一列或一个用户定义数据类型也只能与一个默认值相绑定。在 SQL Server 中使用企业管理器和 Transact-SQL 语句实现默认值的创建、查看、删除以及默认值的绑定与松绑。 (4) 使用约束实施数据完整性:约束是 SQL Server 提供的自动保持数据库完整性的一种方法,定义了可输入表或表的单个列中的数据的限制条件。在 SQL Server 中有 6 种约束:非空值约束、主键约束、外键约束、惟一性约束、检查约束和默认约束。
  1. Gostou de algum slide específico?

    Recortar slides é uma maneira fácil de colecionar informações para acessar mais tarde.

×