数据库原理实验(openGauss)完整性控制
Posted BkbK-
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库原理实验(openGauss)完整性控制相关的知识,希望对你有一定的参考价值。
完整性控制
一、约束
1.创建约束的方法
(1)创建基本表时定义表的完整性约束条件
SQL语言使用 CREATE TABLE
语句创建基本表,其基本格式如下:
CREATE TABLE <表名>
(<列名><数据类型> DEFAULT <缺省值>] [列级约束定义],
<列名><数据类型> DEFAULT <缺省值>] [列级约束定义],
...,
[<表级约束定义>, ,<表级约束定义>]);
-
列约束定义
列级约束定义形式如下:
[CONSTRAINT <约束名>]<列约束>
常用的列约束包括以下几种:
NOT NULL
: 不允许该列取空值;不加NOT NULL
限制时,该列可以取空值。PRIMARY KEY
: 指明该列是主码,其值非空、唯一。UNIQUE
: 该列上的值必须唯一。这相当于说明该列为候选码。CHECK (<条件>)
:指明该列的值必须满足的条件,其中<条件>
是一个涉及该列的布尔表达式。
-
表约束定义
一个表可以包含零个或多个<表约束定义>,用于定义主码、其他候选码、外码和表上的其他约束。
表约束定义形式如下:[CONSTRAINT <约束名>] <表约束>
PRIMARY KEY
(A1, …, Ak):说明属性列A1, …, Ak构成该关系的主码。UNIQUE
(A1, …, Ak):说明属性列A1, …, Ak上的值必须惟一,这相当于说明A1, …, Ak构成该关系的候选码。CHECK
(<条件>):说明该表上的一个完整性约束条件。FOREIGN KEY
(A1, …, Ak) REFERENCES <外表名> (<外表主码>) [<参照触发动作>]它说明属性A1, …, Ak是关系(表) 的外码,<外表名>给出被参照关系的表名,<外表主码>给出被参照系的主码 ,而<参照触发动作>说明违反参照完整性时需要采取的措施。
创建选课信息表并定义约束:
CREATE TABLE SC
(
Sno CHAR (20) ,
Cno CHAR (20),
Grade SMALLINT CHECK (Grade>=0 AND Grade<=100) ,
PRIMARY KEY (Sno , Cno) ,
FOREIGN KEY (Sno) REFERENCES Students (Sno) ,
FOREIGN KEY (Cno) REFERENCES Courses (Cno)
) ;
(2)修改表时定义表的完整性约束条件
SQL 使用 ALTER TABLE
语句修改基本表,其基本格式如下:
ALTER TABLE <表名>
[ADD [COLUMN] <列名><数据类型>[列级约束定义]]
[ALTER [COLUMN] <列名> {SET DEFAULT <缺省值> |
DROP DEFAULT}]
[DROP [ COLUMN ] <列名> {CASCADE | RESTRICT}]
[ADD <表约束定义>]
[DROP CONSTRAINT <约束名>{CASCADE | RESTRICT}]
2.创建约束实例
-
将STUDENTS表中的SNAME列设为唯一键约束:
ALTER TABLE Students ADD UNIQUE(Sname);
-
COURSES表中的CNAME列设为唯一键约束:
ALTER TABLE Courses ADD UNIQUE(Cname);
二、触发器
(1)创建触发器语法
创建触发器语句的一般格式如下:
CREATE TRIGGER <触发器名> <触发时间> <触发事件> ON <表名>
[REFERENCING <旧/新值别名>, …, <旧/新值别名>]
[FOR EACH {ROW | STATEMENT}]
[WHEN (<触发条件>)]
<被触发的SQL语句>
-
<触发时间>可以是
BEFORE
:事件前,AFTER
:事件后 -
<触发事件>可以是T上的
INSERT
、DELETE
、UPDATE
或UPDATE OF
<触发列>, …, <触发列> -
REFERENCING
子句创建一些过渡变量用来存放表T和表T的行更新前的旧值和更新后的新值。<旧/新值别名>可以是如下形式之一:OLD/NEW [ROW] [AS] <变量>
:创建行过渡变量<变量>存放表T的行更新前/后的值OLD/NEW TABLE [AS] <变量>
:创建表过渡变量<变量>存放表T更新前/后的值
-
FOR EACH ROW
定义行级触发器,而FOR EACH STATEMENT定义语
句级触发器缺省时为语句级触发器 -
WHEN
子句说明触发条件,缺省时无条件触发。<触发条件>是一个任意
布尔表达式。 -
<被触发的SQL语句>是触发动作体,具有如下形式:
BEGIN ATOMIC <可执行的SQL语句>; ... END
(2)创建触发器实例
在STUDENTS表上建立触发器,当用户修改学生的学号时给出提示信息:
-
创建函数
CREATE OR REPLACE FUNCTION UpdateStudents() RETURNS TRIGGER AS $$ DECLARE BEGIN RAISE NOTICE 'Trigger is working'; RETURN NEW; END; $$ LANGUAGE PLPGSQL;
-
创建触发器
CREATE TRIGGER UpdateSno AFTER UPDATE OF Sno ON Students FOR EACH ROW EXECUTE PROCEDURE UpdateStudents();
-
测试:
UPDATE Students SET Sno ='201905001' WHERE Sno='201706003';
以上是关于数据库原理实验(openGauss)完整性控制的主要内容,如果未能解决你的问题,请参考以下文章