SQL基础入门-数据库的完整性

数据库的完整性是指数据的正确性和相容性。
数据的正确性是指数据是符合现实世界语义、反映当前实际状况的;
数据的相容性是指数据库的同一对象在不同关系表中的数据是符合逻辑的;
数据的完整性是为了防止数据库中存在不符合语义的数据,也就是防止数据库中存在不正确的数据;
为维护数据库的完整性,数据库管理系统必须能够实现如下功能:1、提供定义完整性约束条件的机制 2、提供完整性检查的方法 3、进行违约处理

实体完整性

一、实体完整性定义:PRIMARY KEY(主码)

1、单属性构成的码有两种定义主码方法 :
①定义为列级约束条件
②定义为表级约束条件

2、多个属性构成的码只有一种定义方法:定义为表级约束条件

定义为列级约束条件

eg: 在建立student表时进行实体完整性约束采用在列级定义主码
CREATE TABLE Student
 ( Sno CHAR(9) PRIMARY KEY,     /*在列级定义主码*/
   Sname CHAR(20) 
   Ssex CHAR(2),
   Sage SMALLINT,
   Sdept CHAR(20)
 );

定义为表级约束条件

eg: 在建立student表时进行实体完整性约束采用在表级定义主码
CREATE TABLE Student
 ( Sno CHAR(10), 
   Sname CHAR(20)
   Ssex CHAR(2),
   Sage SMALLINT,
   Sdept CHAR(20),
   PRIMARY KEY (Sno)       /*在表级定义主码*/
 );

多属性情况:定义为表级约束条件

eg: 在建立sc表时进行实体完整性约束只能采用在表级定义主码
CREATE TABLE SC
 ( Sno CHAR(10), 
   Cno CHAR(4),
   Grade SMALLINT,
   PRIMARY KEY (Sno, Cno)       /*只能在表级定义主码*/
 );

二、实体完整性检查和违约处理

插入记录或对主码列进行更新操作时,按照实体完整性规则自动进行检查。
包括:
1)检查主码值是否唯一,如果不唯一则拒绝插入或修改。
2)检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改。

  1. 唯一约束(unique)
    以插入重复主键Sno(‘201215121’)为例。
    语句为:
    insert into student
    Values
    (‘201215121’,‘小五’,‘男’,20,‘CS’)
    得到如下结果:
    在这里插入图片描述
  2. 非空约束(not null)
    以插入Sno为NULL则拒绝插入为例。
    语句:
    insert into student
    Values
    (NULL,‘赵六’,‘男’,20,‘CS’)
    得到结果如下:
    在这里插入图片描述

参照完整性

一、参照完整性定义:

FOREIGN KEY (属性列) REFERENCES 表名(主码)

 FOREIGN KEY  (属性列)         /*定义列为外码*/
 REFERENCES 表名(主码)      /*参照哪些表的主码*/

二、参照完整性检查和处理

1、拒绝(NO ACTION)执行(默认策略)
2、级联(CASCADE)操作
3、设置为空值(SET-NULL)

对于参照完整性,除了应该定义外码,还应定义外码列是否允许空值。
在这里插入图片描述

eg:以书本上的例子举例,在建表时定义参照完整性
CREATE TABLE SC
 ( Sno CHAR(10) NOT NULL, 
   Cno CHAR(10) NOT NULL,
   Grade SMALLINT,
   PRIMARY KEY (Sno, Cno),
   FOREIGN KEY (Sno) REFERENCES Student(Sno)
        ON DELETE CASCADE     /*删除Student记录时级联删除SC相应记录*/
        ON UPDATE CASCADE,   /*更新Student记录时级联更新SC相应记录*/
   FOREIGN KEY (Cno) REFERENCES Course(Cno)
       ON DELETE NO ACTION  /*删除Course记录使与SC不一致则拒绝删除*/
       ON UPDATE NO ACTION   /*更新Course的Cno时使与SC不一致则拒绝删除*/
  );


三、具体举例说明

例1:把student表中Sno’201215122 '修改为’201215100 ',则SC表中的Sno’201215122 '也级联修改为’201215100 ’

sc原表为:
在这里插入图片描述
输入语句:

update student 
set Sno='201215100 '
where Sno='201215122 '

sc表级联修改后为:
在这里插入图片描述

例2:把student表中Sno’201215121 '删除,则SC表中的Sno’201215121 '也级联删除

sc原表为:
在这里插入图片描述
输入语句:

delete from student
 where Sno='201215121 '

sc表级联修改后为:
在这里插入图片描述

例3:删除Course的’Cno=3’,记录使与SC不一致则拒绝删除

输入语句:

delete from course
 where Cno='3'

得到结果为:
在这里插入图片描述

例4:把course表中Cno=2修改为Cno=10,记录使与SC不一致则拒绝删除

输入语句:

update course
set cno='10'
where cno='2'

得到结果为:
在这里插入图片描述

例5:尝试在SC中插入元组

输入语句:

insert into sc
Values(201215190,5,87)

得到结果为:
在这里插入图片描述

例6:修改外码值

输入语句:

Update sc
Set sno=17200890Where cno=1

得到结果为:
在这里插入图片描述

用户定义完整性

一、用户定义完整性语句:

1、 不允许取空值:NOT NULL
2、列值唯一:UNIQUE
3、CHECK子句:CHECK(约束条件表达式)
4、违约处理方式:拒绝

二、举例

1、不允许取空值和列值唯一在建表时即要说明

create table course2
(
Cno char(10),
Cname char(20)UNIQUE NOT NULL ,      /*不允许取空值*列值唯一*/
Cpno char(10),
Ccredit smallint,
primary key(Cno),
foreign key(Cpno) references course2(Cno)
)

例1:建course表未加约束,course2约束了唯一和非空。现在course和course2都进行加入(‘10’,‘数据挖掘’,‘5’,4)的操作

在course表中加入(‘10’,‘数据挖掘’,‘5’,4)
原course表:
在这里插入图片描述
修改后course表:
在这里插入图片描述
在course2表中加入(‘10’,‘数据挖掘’,‘5’,4)得到结果为:
在这里插入图片描述

例2:建course表未加约束,course2约束了唯一和非空。现在course和course2都进行加入(‘99’,'Null,‘5’,4)的操作。

在course表中加入(99’,‘Null’,‘5’,4)
原course表:
在这里插入图片描述
修改完的course表:
在这里插入图片描述
在course2表中加入(‘99’,‘null’,‘5’,4)得到结果为:
在这里插入图片描述
2、CHECK语句

语句格式:CHECK(约束条件表达式)
插入的数据需要满足约束条件约束,不满足则拒绝。

例1(重建一个表)

CREATE TABLE Student2
 ( Sno CHAR(10) PRIMARY KEY, 
   Sname CHAR(20) NOT NULL,
   Ssex CHAR(4) CHECK(Ssex IN ('男','女')),
                    /*Ssex属性只允许取’男’或’女’*/
   Sage SMALLINT,
   Sdept CHAR(20)
 );

当我们在Sex属性项分量不输入男或女时会拒绝操作:
在这里插入图片描述

例2:(重建一个表)

REATE TABLE student4
 ( Sno CHAR(10) PRIMARY KEY, 
   Sname CHAR(20) NOT NULL,
   Ssex CHAR(4) 
   Sage SMALLINT, CHECK(Sage>=0 AND Sage<=50),
            /* Sage只能取0-50之间的整数*/
   Sdept CHAR(20)
  );

当我们在Sage属性项分量不输入0-50之间的整数会拒绝操作:
在这里插入图片描述

完整性约束命名子句

上述的完整性约束条件都在CREATE TABLE语句中定义,SQL还在CREATE TABLE语句中提供了完整性约束命名子句CONSTRAINT,用来对完整性约束条件命名,从而可以灵活地增加、删除一个完整性约束条件。

1、语法格式

CONSTRAINT <完整性约束条件名> <完整性约束条件>
完整性约束条件包括NOT NULL,UNIQUE等。

eg:
CREATE TABLE Student5
 ( Sno char(10), 
   Sname CHAR(20) CONSTRAINT C1 NOT NULL,
   Ssex CHAR(4) CONSTRAINT C2 CHECK(Ssex IN ('男','女')),
   Sage SMALLINT CONSTRAINT C3 CHECK(Sage<30),
    PRIMARY KEY (Sno),
);

2、修改表中的完整性约束

可以使用ALTER TABLE语句修改表中的完整性限制。
语句:
ALTER TABLE<表名>
  DROP/ADD CONSTRAINT...

eg:去掉上例student表中对性别的约束。
    ALTER TABLE student5
         DROP CONSTRAINT C2;
            /*删除约束*/

希望对你的学习有帮助!
参数书籍为:《数据库系统概论 第五版》 王珊老师等著

©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页