SQL Server 数据库的完整性
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
CREATE TABLE <表名>
( {<列定义> }| <表级完整性约束条件>[,<表级完整性约束条件>])
其中,表级完整性约束条件定义如下: [ CONSTRAINT <约束名>] { <PRIMARY KEY ( <列> [ , <列> ] ) > | <UNIQUE ( <列> [ , <列> ] ) > | <外键定义> <CHECK ( <条件表达式> )>
如果需要对一个已存在的表结构增加列及列级完整性约束,或者删除列级完整性约束,R TABLE <表名> {ADD <列名> <数据类型> [NOT NULL ] [列完整性约束条件] | DROP <约束名>}
重庆IT论坛
4.2.1 列级完整性约束的定
|
}
重庆IT论坛
4.2.2 表级完整性约束的定义
【例4.7】 在XSCJ数据库中定义XS_KC_1表结构,对学号和课程号字段创建 】 PRIMARY KEY约束。
USE XSCJ CREATE TABLE XS_KC_1 ( 学号 char(6) NOT NULL, 课程号 char(3) NOT NULL, 成绩 tinyint NULL, CONSTRAINT pk_key PRIMARY KEY(学号,课程号) /*定义主键约束*/ ) GO
列级完整性约束定义的语法格式与创建表结构时的相同。 【例4.4】 修改XSCJ数据库中XS_1表,增加入学日期字段,并将当前日期定义为 】 该字段的初始默认值。
USE XSCJ ALTER TABLE XS_1 ADD 入学日期 datetime DEFAULT getdate() WITH VALUES GO
CREATE TABLE <表名> ( <列名> <数据类型> [<NOT NULL>] [<列完整性约束条件>] [ DEFAULT <默认值表达式>] [,<列名> <数据类型> [<NOT NULL>] [<列完整性约束条件>] [ DEFAULT <默认值表达式>]] )
其中,列完整性约束条件定义的语法如下:
重庆IT论坛
4.2.2 表级完整性约束的定义
【例4.8】 在XSCJ数据库中先定义XS_KC_1表结构,然后通过修改表结构,将学号和 】 课程号字段定义为主键。
USE XSCJ ALTER TABLE XS_1 DROP tel_con GO
重庆IT论坛
4.2.2 表级完整性约束的定义
表级完整性约束主要用于如下几方面:① 若主键、候选键、外键由单一列构成时,则 可将其定义为列级完整性约束或表级完整性约束,但如果主键、候选键、外键由多列构成, 则应将其定义为表级完整性约束;② 如果check约束仅涉及单列,则可将其定义为列级完 整性约束或表级完整性约束,但若该check约束涉及多列,则应将其定义为表级完整性约束。 在创建表结构时,定义表级完整性约束的语法如下:
如果INSERT,UPDATE或DELETE语句执行时违反完整性约束,将返回一条出错 信息并拒绝更新。为正确指出已被违反的完整性约束,必须为每个完整性约束指定名称, 这通过CONSTRAINT子句指定。 通过修改表结构创建或删除表级完整性约束的语法如下:
ALTER TABLE {ADD < 表级完整性约束条件> | DROP CONSTRAINT <约束名>}
重庆IT论坛
4.1.2 数据库完整性的分类
① 实体完整性:又称为行的完整性,要求每个表的主码值不能为空且能唯一地标识对 应的记录。例如,将XSCJ数据库XS表的学号字段定义为主码,则XS表中每一记录学号字 段的取值必须满足两个条件:不能取空值;不能与其他记录的学号相同。 ② 用户定义完整性:是用户根据应用的需要,利用DBMS提供的数据库完整性定义机 制定义的数据必须满足的语义要求。 ③ 参照完整性:又称为引用完整性。参照完整性通过定义主表(被参照表)中主码与 从表(参照表)中外码的对应关系,来保证主表数据与从表数据的一致性。
重庆IT论坛
4.1.2 数据库完整性的分类
可从不同角度对数据库的完整性分类,例如,完整性约束条件作用的对象可以是关系、 元组、列3种,根据完整性约束条件作用的对象,可分为: ① 列约束。又称为字段约束,主要是对字段的类型、取值范围等定义约束。 ② 元组约束。主要是对元组中各字段间的联系定义约束。 ③ 关系约束。是定义表内若干元组间的约束,或定义表之间联系的约束。 按照完整性约束对象的状态来分,可将完整性分为静态完整性约束和动态完整性约束。 ① 静态完整性约束:指数据库处于一确定状态时,数据对象应满足的约束条件,它是 反映数据库状态合理性的约束,这是最重要的一类完整性约束。例如,规定学号的前两位 表示入学年份,中间两位表示系的编号,后三位为顺序编号;出生日期的格式为 YYYY/MM/DD等。 ② 动态约束:指数据库从一种稳定状态转变为另一稳定状态时,新、旧值之间应满足 的约束,它是反映数据库状态变迁的约束。例如,在图书管理系统中,当读者借一本书时, 该读者的借书数量应在原来的基础上加1,但借书的总数量不能超过图书馆允许出借的最 大数。 根据完整性的应用特征,可将完整性分为:实体完整性、用户定义完整性与参照完整 性。
第4章 数据库的完整性
4.1 数据库的完整性 4.2 数据库完整性定义机制 4.3 利用完整性定义机制实现参照完整性
IT技术教程下载
重庆IT论坛
4.1 数据库的完整性
4.1.1 DBMS的完整性控制机制
DBMS的完整性控制机制应具有两方面的功能: (1)定义功能:为数据库用户提供定义完整性约束条件的机制。 (2)检查功能:检查用户发出的操作请求是否违背了完整性约束条件,如果发现用户 的操作请求使数据违背了完整性约束条件,则执行相应的处理,以保证数据库中数据的完整 性。如下的二元组描述了DBMS实现一个数据库完整性的机制: 数据库完整性机制=(完整性约束集,完整性约束检查) 完整性约束集中的每个成员可抽象为一个五元组:完整性约束集成员=(数据对象,约 束,触发DBMS完整性检查的操作,触发条件,违反完整性约束时的操作)。 数据对象指完整性约束作用的数据对象,可以是表、记录、字段等;触发DBMS进行完 整性检查的操作,可以是增、删、改、建表、创建主码等;对数据对象触发完整性检查时, 相关的数据对象应满足一定的触发条件;当数据违反完整性约束时,执行相应的操作。
表4.2 XS_KC表
课 程 号 101 102 103 202 203 101 103 202 202 203 101 302 101 301 101 301 成 绩 80 68 65 75 82 45 88 85 50 73 86 78 72 88 90 65
重庆IT论坛
重庆IT论坛
4.2.1 列级完整性约束的定
DEFAULT选项:为指定字段定义默认值。 外码的定义及实现参照完整性的方法见4.3节。 【例4.1】 在XSCJ数据库中定义XS_1表,并将总学分字段的初始默认值定义为0。 】
USE XSCJ CREATE TABLE XS_1 ( 学号 char(6) NOT NULL, 姓名 char(8) NOT NULL, 性别 bit NOT NULL, 出生日期 smalldatetime NOT NULL, 总学分 tinyint NULL default 0 ) GO
/*定义默认值为0*/
【例4.2】 在数据库XSCJ中定义KC_1表,学生的学分取值范围在0~10之间,定 】 义学分的约束条件。
USE XSCJ CREATE TABLE KC_1 ( 课程号 char(6) NOT NULL, 课程名 char(8) NOT NULL, 学分 tinyint NULL CHECK (学分 >=0 AND学分<=10) ) GO
例4.4中getdate( )表示默认值日期为当前日期,WITH VALUES 仅用在对表添加 新字段的情况下。若使用了WITH VALUES,则将为表中各现有行添加的新字段提供默认 值;如果没有使用 WITH VALUES,那么每行的新列中都将为NULL值。 【例4.5】 修改例4.1中定义的XS_1表,增加电话号码字段,并且要求输入的电话号 】 码为8个数字字符。
USE XSCJ ALTER TABLE XS_1 ADD 电话号码 CHAR(15) NULL CONSTRAINT tel_con CHECK (电话号码 like '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]' ) GO
运算符like表示选择0~9之间的数字作为电话号码,并且保证是8个数字。 【例4.6】 删除例4.5中定义的CHECK约束tel_con。 】
重庆IT论坛
4.2.1 列级完整性约束的定
【例4.3】 在XSCJ数据库中定义XS_1表结构,对学号字段创建PRIMARY KEY约束, 】 身份证号字段定义UNIQUE约束,入学日期的初始值定义为当前日期。
USE XSCJ CREATE TABLE XS_1 ( 学号 char(6) NOT NULL CONSTRAINT XH_PK PRIMARY KEY, /*定义主键约束*/ 身份证号 char(15) NOT NULL UNIQUE , /*定义UNIQUE约束*/ char 8 姓名 char(8) NOT NULL, 性别 bit NOT NULL, 出生日期 smalldatetime NOT NULL, 总学分 tinyint NULL, 入学日期 datetime CONSTRAINT datedflt DEFAULT getdate() ) GO
重庆IT论坛
4.1.2 数据库完整性的分类
表4.1 XS表
姓 名 王林 程小明 赵倪晓 朱庆 李运洪 张美红 性 别 男 男 女 男 女 女 出生日期 1989-3-2 1988-11-5 1989-4-5 1988-6-4 1990-1-6 1989-8-9 专 业 计算机应用 计算机应用 通信工程 通信工程 英语 英语 总 学 分 182 182 180 180 170 170 是 是 是 班 干 否 备 注
4.2 数据库完整性定义机制
4.2.1 列级完整性约束的定义
对于数据列的约束主要有以下几方面:① 定义主键;② 定义候选键;③ 定义默认 值约束,为某个字段指定默认值;④ 定义CHECK约束,为某个字段的取值指定一个约 束范围或条件;⑤ 定义外码。 列级完整性约束可在建表结构时定义,建表结构的语法表述如下:
[CONSTRAINT <约束名>] {PRIMARY KEY | UNIQUE | <CHECK ( <条件表达式>) > | <外码定义 >}
如果考虑删除约束的方便,在定义约束时,应给出约束名。 PRIMARY KEY用于定义主键,UNIQUE 用于定义候选键,CHECK表达式用于定 义约束条件。 候选键和主键有两个重要区别:① 一个表中可以有多个候选键,但只能有一个主 键;② 主键的取值不能为空值(NULL),候选键如果没有NOT NULL约束,则可以取 空(NULL)值。
主码
学 号 07050101 07050102 07030201 07030202 07060101 07060102
重庆IT论坛
4.1.2 数据库完整性的分类
外码
学 号 07050101 07050101 07050101 07050101 07050101 07050102 07050102 07050102 07030201 07030201 07030202 07030202 07060101 07060101 07060102 07060102
( {<列定义> }| <表级完整性约束条件>[,<表级完整性约束条件>])
其中,表级完整性约束条件定义如下: [ CONSTRAINT <约束名>] { <PRIMARY KEY ( <列> [ , <列> ] ) > | <UNIQUE ( <列> [ , <列> ] ) > | <外键定义> <CHECK ( <条件表达式> )>
如果需要对一个已存在的表结构增加列及列级完整性约束,或者删除列级完整性约束,R TABLE <表名> {ADD <列名> <数据类型> [NOT NULL ] [列完整性约束条件] | DROP <约束名>}
重庆IT论坛
4.2.1 列级完整性约束的定
|
}
重庆IT论坛
4.2.2 表级完整性约束的定义
【例4.7】 在XSCJ数据库中定义XS_KC_1表结构,对学号和课程号字段创建 】 PRIMARY KEY约束。
USE XSCJ CREATE TABLE XS_KC_1 ( 学号 char(6) NOT NULL, 课程号 char(3) NOT NULL, 成绩 tinyint NULL, CONSTRAINT pk_key PRIMARY KEY(学号,课程号) /*定义主键约束*/ ) GO
列级完整性约束定义的语法格式与创建表结构时的相同。 【例4.4】 修改XSCJ数据库中XS_1表,增加入学日期字段,并将当前日期定义为 】 该字段的初始默认值。
USE XSCJ ALTER TABLE XS_1 ADD 入学日期 datetime DEFAULT getdate() WITH VALUES GO
CREATE TABLE <表名> ( <列名> <数据类型> [<NOT NULL>] [<列完整性约束条件>] [ DEFAULT <默认值表达式>] [,<列名> <数据类型> [<NOT NULL>] [<列完整性约束条件>] [ DEFAULT <默认值表达式>]] )
其中,列完整性约束条件定义的语法如下:
重庆IT论坛
4.2.2 表级完整性约束的定义
【例4.8】 在XSCJ数据库中先定义XS_KC_1表结构,然后通过修改表结构,将学号和 】 课程号字段定义为主键。
USE XSCJ ALTER TABLE XS_1 DROP tel_con GO
重庆IT论坛
4.2.2 表级完整性约束的定义
表级完整性约束主要用于如下几方面:① 若主键、候选键、外键由单一列构成时,则 可将其定义为列级完整性约束或表级完整性约束,但如果主键、候选键、外键由多列构成, 则应将其定义为表级完整性约束;② 如果check约束仅涉及单列,则可将其定义为列级完 整性约束或表级完整性约束,但若该check约束涉及多列,则应将其定义为表级完整性约束。 在创建表结构时,定义表级完整性约束的语法如下:
如果INSERT,UPDATE或DELETE语句执行时违反完整性约束,将返回一条出错 信息并拒绝更新。为正确指出已被违反的完整性约束,必须为每个完整性约束指定名称, 这通过CONSTRAINT子句指定。 通过修改表结构创建或删除表级完整性约束的语法如下:
ALTER TABLE {ADD < 表级完整性约束条件> | DROP CONSTRAINT <约束名>}
重庆IT论坛
4.1.2 数据库完整性的分类
① 实体完整性:又称为行的完整性,要求每个表的主码值不能为空且能唯一地标识对 应的记录。例如,将XSCJ数据库XS表的学号字段定义为主码,则XS表中每一记录学号字 段的取值必须满足两个条件:不能取空值;不能与其他记录的学号相同。 ② 用户定义完整性:是用户根据应用的需要,利用DBMS提供的数据库完整性定义机 制定义的数据必须满足的语义要求。 ③ 参照完整性:又称为引用完整性。参照完整性通过定义主表(被参照表)中主码与 从表(参照表)中外码的对应关系,来保证主表数据与从表数据的一致性。
重庆IT论坛
4.1.2 数据库完整性的分类
可从不同角度对数据库的完整性分类,例如,完整性约束条件作用的对象可以是关系、 元组、列3种,根据完整性约束条件作用的对象,可分为: ① 列约束。又称为字段约束,主要是对字段的类型、取值范围等定义约束。 ② 元组约束。主要是对元组中各字段间的联系定义约束。 ③ 关系约束。是定义表内若干元组间的约束,或定义表之间联系的约束。 按照完整性约束对象的状态来分,可将完整性分为静态完整性约束和动态完整性约束。 ① 静态完整性约束:指数据库处于一确定状态时,数据对象应满足的约束条件,它是 反映数据库状态合理性的约束,这是最重要的一类完整性约束。例如,规定学号的前两位 表示入学年份,中间两位表示系的编号,后三位为顺序编号;出生日期的格式为 YYYY/MM/DD等。 ② 动态约束:指数据库从一种稳定状态转变为另一稳定状态时,新、旧值之间应满足 的约束,它是反映数据库状态变迁的约束。例如,在图书管理系统中,当读者借一本书时, 该读者的借书数量应在原来的基础上加1,但借书的总数量不能超过图书馆允许出借的最 大数。 根据完整性的应用特征,可将完整性分为:实体完整性、用户定义完整性与参照完整 性。
第4章 数据库的完整性
4.1 数据库的完整性 4.2 数据库完整性定义机制 4.3 利用完整性定义机制实现参照完整性
IT技术教程下载
重庆IT论坛
4.1 数据库的完整性
4.1.1 DBMS的完整性控制机制
DBMS的完整性控制机制应具有两方面的功能: (1)定义功能:为数据库用户提供定义完整性约束条件的机制。 (2)检查功能:检查用户发出的操作请求是否违背了完整性约束条件,如果发现用户 的操作请求使数据违背了完整性约束条件,则执行相应的处理,以保证数据库中数据的完整 性。如下的二元组描述了DBMS实现一个数据库完整性的机制: 数据库完整性机制=(完整性约束集,完整性约束检查) 完整性约束集中的每个成员可抽象为一个五元组:完整性约束集成员=(数据对象,约 束,触发DBMS完整性检查的操作,触发条件,违反完整性约束时的操作)。 数据对象指完整性约束作用的数据对象,可以是表、记录、字段等;触发DBMS进行完 整性检查的操作,可以是增、删、改、建表、创建主码等;对数据对象触发完整性检查时, 相关的数据对象应满足一定的触发条件;当数据违反完整性约束时,执行相应的操作。
表4.2 XS_KC表
课 程 号 101 102 103 202 203 101 103 202 202 203 101 302 101 301 101 301 成 绩 80 68 65 75 82 45 88 85 50 73 86 78 72 88 90 65
重庆IT论坛
重庆IT论坛
4.2.1 列级完整性约束的定
DEFAULT选项:为指定字段定义默认值。 外码的定义及实现参照完整性的方法见4.3节。 【例4.1】 在XSCJ数据库中定义XS_1表,并将总学分字段的初始默认值定义为0。 】
USE XSCJ CREATE TABLE XS_1 ( 学号 char(6) NOT NULL, 姓名 char(8) NOT NULL, 性别 bit NOT NULL, 出生日期 smalldatetime NOT NULL, 总学分 tinyint NULL default 0 ) GO
/*定义默认值为0*/
【例4.2】 在数据库XSCJ中定义KC_1表,学生的学分取值范围在0~10之间,定 】 义学分的约束条件。
USE XSCJ CREATE TABLE KC_1 ( 课程号 char(6) NOT NULL, 课程名 char(8) NOT NULL, 学分 tinyint NULL CHECK (学分 >=0 AND学分<=10) ) GO
例4.4中getdate( )表示默认值日期为当前日期,WITH VALUES 仅用在对表添加 新字段的情况下。若使用了WITH VALUES,则将为表中各现有行添加的新字段提供默认 值;如果没有使用 WITH VALUES,那么每行的新列中都将为NULL值。 【例4.5】 修改例4.1中定义的XS_1表,增加电话号码字段,并且要求输入的电话号 】 码为8个数字字符。
USE XSCJ ALTER TABLE XS_1 ADD 电话号码 CHAR(15) NULL CONSTRAINT tel_con CHECK (电话号码 like '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]' ) GO
运算符like表示选择0~9之间的数字作为电话号码,并且保证是8个数字。 【例4.6】 删除例4.5中定义的CHECK约束tel_con。 】
重庆IT论坛
4.2.1 列级完整性约束的定
【例4.3】 在XSCJ数据库中定义XS_1表结构,对学号字段创建PRIMARY KEY约束, 】 身份证号字段定义UNIQUE约束,入学日期的初始值定义为当前日期。
USE XSCJ CREATE TABLE XS_1 ( 学号 char(6) NOT NULL CONSTRAINT XH_PK PRIMARY KEY, /*定义主键约束*/ 身份证号 char(15) NOT NULL UNIQUE , /*定义UNIQUE约束*/ char 8 姓名 char(8) NOT NULL, 性别 bit NOT NULL, 出生日期 smalldatetime NOT NULL, 总学分 tinyint NULL, 入学日期 datetime CONSTRAINT datedflt DEFAULT getdate() ) GO
重庆IT论坛
4.1.2 数据库完整性的分类
表4.1 XS表
姓 名 王林 程小明 赵倪晓 朱庆 李运洪 张美红 性 别 男 男 女 男 女 女 出生日期 1989-3-2 1988-11-5 1989-4-5 1988-6-4 1990-1-6 1989-8-9 专 业 计算机应用 计算机应用 通信工程 通信工程 英语 英语 总 学 分 182 182 180 180 170 170 是 是 是 班 干 否 备 注
4.2 数据库完整性定义机制
4.2.1 列级完整性约束的定义
对于数据列的约束主要有以下几方面:① 定义主键;② 定义候选键;③ 定义默认 值约束,为某个字段指定默认值;④ 定义CHECK约束,为某个字段的取值指定一个约 束范围或条件;⑤ 定义外码。 列级完整性约束可在建表结构时定义,建表结构的语法表述如下:
[CONSTRAINT <约束名>] {PRIMARY KEY | UNIQUE | <CHECK ( <条件表达式>) > | <外码定义 >}
如果考虑删除约束的方便,在定义约束时,应给出约束名。 PRIMARY KEY用于定义主键,UNIQUE 用于定义候选键,CHECK表达式用于定 义约束条件。 候选键和主键有两个重要区别:① 一个表中可以有多个候选键,但只能有一个主 键;② 主键的取值不能为空值(NULL),候选键如果没有NOT NULL约束,则可以取 空(NULL)值。
主码
学 号 07050101 07050102 07030201 07030202 07060101 07060102
重庆IT论坛
4.1.2 数据库完整性的分类
外码
学 号 07050101 07050101 07050101 07050101 07050101 07050102 07050102 07050102 07030201 07030201 07030202 07030202 07060101 07060101 07060102 07060102