完整性约束
一、完整性约束的概念
保证授权用户对数据库所做的修改不会破坏数据的一致性。
因此,完整性约束 防止的是对数据的意外破坏。
二、完整性约束分为三类,包括:
\1. 域完整性 :是指给定列的取值范围(即输入的有效性)
\2. 实体完整性 :规定表中的每一行在表中是唯一的一个实体(实体就是一条记录)
\3. 参照完整性 :保持主外键之间的参照规则。它保证的是表之前数据的一致性,防止了数据丢失或无意义的数据在数据库中扩散。
4.用户定义完整性:不同的关系数据库系统根据其应用环境的不同,往往还需要一些特殊的约束条件。用户定义的完整性是针对某个特定关系数据库的约束条件,它反映某一具体应用必须满足的语义要求。(就是根据特定的业务,用户自定义的规则)
三、完整性约束的类型
\1. 主键约束(PRIMARY KEY):要求主键列 数据唯一,并且不允许为空,PRIMARY KEY = UNIQUE + NOT NULL。主键可以包含表的一列或多列。你定义的主键包含多列时,你只能在表级定义。
# 在表级定义主键约束
CREATE TABLE student (
sno NUMBER(3),
same VARCHAR2(15),
gender CHAR(3) DEFAULT ‘男’,
age NUMBER(2),
CONSTRAINTS pk_student PRIMARY KEY (sno,sname)
);
# 在列级定义主键约束
CREATE TABLE student (
sno NUMBER(3) CONSTRAINTS pk_student PRIMARY KEY,
sname VARCHAR2(15) CONSTRAINTS KEY,
gender CHAR(3) DEFAULT ‘男’,
age NUMBER(2)
);
\2. 非空约束(NOT NULL):要求该列不能为空,非空约束只能在「列」级别定义。
CREATE TABLE student (
sno NUMBER(3),
same VARCHAR2(15) NOT NULL,
gender CHAR(3) DEFAULT ‘男’,
age NUMBER(2),
CONSTRAINTS pk_student PRIMARY KEY (sno,sname)
);
3.唯一约束(UNIQUE) :要求该列唯一,允许为空。
CREATE TABLE student (
sno NUMBER(3),
sname VARCHAR2(15) NOT NULL,
gender CHAR(3) DEFAULT ‘男’,
age NUMBER(2),
email VARCHAR2(30) UNIQUE,
CONSTRAINTS pk_student PRIMARY KEY (sno,sname)
);
4.检查约束(CHECK) :某列取值范围限制、格式限制等,如年龄的约束。
CREATE TABLE student (
sno NUMBER(3),
sname VARCHAR2(15) NOT NULL,
gender CHAR(3) DEFAULT ‘男’ CHECK(gender IN (‘男’, ‘女’)),
age NUMBER(2) CHECK (age BETWEEN 18 AND 30),
CONSTRAINTS pk_student PRIMARY KEY (sno,sname)
);
5.外键约束 :用于两表之间建立关系,需要指定引用主表哪列。外键通常用来约束两个表之间的数据关系,定义外键那张表成为子表,另一张表称为主表。在表的创建过程中,应先创建主表,后创建子表。
CREATE TABLE clazz (
cno NUMBER(3) PRIMARY KEY,
cname VARCHAR2(30) NOT NULL UNIQUE,
cdate DATE
);
CREATE TABLE student (
sno NUMBER(3),
sname VARCHAR2(15) NOT NULL,
gender CHAR(3) DEFAULT ‘男’,
age NUMBER(2),
sdate DATE,
email VARCHAR2(30),
cno NUMBER(3) REFERENCES clazz (cno),– 在列级别定义外键约束
CONSTRAINTS pk_student PRIMARY KEY (sno),
CONSTRAINTS uk_student_email UNIQUE (email),
CONSTRAINTS ck_student_age CHECK (age BETWEEN 18 AND 30),
CONSTRAINTS ck_student_gender CHECK(gender IN (‘男’, ‘女’))
);
6.级联删除 :添加外键约束后,在删除主表信息时,会先检查该信息在子表中有没有被引用。如果有关联的子表信息,那么主表中的信息不允许被删除,必须先删除子表中的相关信息,才能删除主表中的信息。
这种情况下,我们可以设置级联删除,来执行相关操作。
对于主表的删除和修改主键值的操作,会对依赖关系产生依赖影响,以删除为例:当要删除主表的某个记录,即删除一个主键值,那么对依赖的影响可采取下列三种做法:
· RESTRICT 方式:只有当依赖表中没有一个外键值与要删除的主表中主键值相对应时,才可执行操作。
· CASCADE 方式:将依赖表中所有外键值与主表中要删除的主键值相对应的记录一起删除。
· SET NULL 方式:将依赖表中所有与主表中被删除的主键值相对应的外键值设为空值。
– 设置级联删除
CREATE TABLE student (
sno NUMBER(3),
sname VARCHAR2(15) NOT NULL,
gender CHAR(3) DEFAULT ‘男’,
age NUMBER(2),
sdate DATE,
email VARCHAR2(30),
cno NUMBER(3),
CONSTRAINTS pk_student PRIMARY KEY (sno),
CONSTRAINTS uk_student_email UNIQUE (email),
CONSTRAINTS ck_student_age CHECK (age BETWEEN 18 AND 30),
CONSTRAINTS ck_student_gender CHECK(gender IN (‘男’, ‘女’)),
CONSTRAINTS fk_student_cno FOREIGN KEY (cno) REFERENCES clazz (cno) ON DELETE CASCADE– 级联删除
);
DELETE FROM clazz WHERE cno=401;
– 设置级联设空
DROP TABLE student;
CREATE TABLE student (
sno NUMBER(3),
sname VARCHAR2(15) NOT NULL,
gender CHAR(3) DEFAULT ‘男’,
age NUMBER(2),
sdate DATE,
email VARCHAR2(30),
cno NUMBER(3),
CONSTRAINTS pk_student PRIMARY KEY (sno),
CONSTRAINTS uk_student_email UNIQUE (email),
CONSTRAINTS ck_student_age CHECK (age BETWEEN 18 AND 30),
CONSTRAINTS ck_student_gender CHECK(gender IN (‘男’, ‘女’)),
CONSTRAINTS fk_student_cno FOREIGN KEY (cno) REFERENCES clazz (cno) ON DELETE SET NULL– 级联设空
);
7.修改表时添加约束 :修改表时,只能添加或删除约束,不能修改约束。
CREATE TABLE student (
sno NUMBER(3),
sname VARCHAR2(15) NOT NULL,
gender CHAR(3) DEFAULT ‘男’,
age NUMBER(2),
sdate DATE,
email VARCHAR2(30),
cno NUMBER(3)
);
ALTER TABLE student ADD CONSTRAINTS pk_student PRIMARY KEY (sno);
ALTER TABLE student ADD CONSTRAINTS uk_student_email UNIQUE (email);
ALTER TABLE student ADD CONSTRAINTS ck_student_age CHECK (age BETWEEN 18 AND 30);
ALTER TABLE student DROP CONSTRAINTS ck_student_gender CHECK (gender IN (‘男’, ‘女’));
ALTER TABLE student DROP CONSTRAINTS fk_student_cno FOREIGN KEY (cno) REFERENCES clazz (cno);