完整性控制

文章目录

  • 完整性控制
    • 一、约束
      • 1.创建约束的方法
        • (1)创建基本表时定义表的完整性约束条件
        • (2)修改表时定义表的完整性约束条件
      • 2.创建约束实例
    • 二、触发器
      • (1)创建触发器语法
      • (2)创建触发器实例

一、约束

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上的INSERTDELETEUPDATEUPDATE 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)】完整性控制相关推荐

  1. 【数据库原理实验(openGauss)】实验报告

    <数据库系统原理实验>报告 文章目录 <数据库系统原理实验>报告 一.实验课程性质和教学目标 二.实验课程教学基本要求 三.实验教学内容 实验一 认识DBMS系统 (一)实验目 ...

  2. 【数据库原理实验(openGauss)】金融场景化实验

    金融场景化实验 文章目录 金融场景化实验 一.金融数据模型 1.E-R图 2.关系模式 3.物理模型 Client(客户)表 bank_card(银行卡)表 finances_product(理财产品 ...

  3. 【数据库原理实验(openGauss)】交互式SQL语句

    交互式SQL语句 文章目录 交互式SQL语句 一.数据准备 (1)向Departments中写入数据 (2)向Teachers中写入数据 (3)向Students中写入数据 (4)向Courses中写 ...

  4. 【数据库原理实验(openGauss)】 使用JDBC连接数据库

    使用JDBC连接数据库 文章目录 使用JDBC连接数据库 一.准备连接环境 1.修改数据库的pg_hba.conf文件 2.登陆数据库授权退出 3.修改数据库监听地址 4.下载Java驱动包导入工具 ...

  5. 【数据库原理实验(openGauss)】数据库的备份与恢复

    数据库的备份与恢复 文章目录 数据库的备份与恢复 一.物理备份和恢复 实验准备: (1)物理备份 (2)物理备份恢复 二.逻辑备份和恢复 实验准备: (1)gs_dump备份 1.gs_dump备份示 ...

  6. 【数据库原理实验(openGauss)】事务与并发控制

    事务与并发控制 文章目录 事务与并发控制 一.事务 (1)事务的ACID特性 (2)事务管理 (3)事务实例 1.未提交的事务 2.已提交的事务 二.并发控制 (1)加锁语法 (2)加锁实例 一.事务 ...

  7. 【数据库原理实验(openGauss)】视图

    视图 文章目录 视图 一.创建视图 二.基于视图的查询 三.基于视图的更新 四.删除视图 五.对视图的理解 一.创建视图 CREATE VIEW CS_Students AS SELECT Sno, ...

  8. 【数据库原理实验(openGauss)】认识DBMS系统

    认识DBMS系统(openGauss) 文章目录 认识DBMS系统(openGauss) 一.openGauss安装目录 (1)集群openGauss安装目录 (2)集群openGauss数据目录 ( ...

  9. 【数据库原理实验(openGauss)】 安全性控制

    安全性控制 文章目录 安全性控制 一.用户及角色 (1)用户 (2)角色 二.权限设置及回收 1.将系统权限授权给用户或者角色 2.将数据库对象授权给角色或用户 3.将用户或者角色的权限授权给其他用户 ...

最新文章

  1. TVM编译机器学习到 WASM 和 WebGPU
  2. 阿里离职员工吐槽加班太疯狂,所有的高薪都是加班加出来的!被榨干到一丝精力都不剩!婚姻不保!...
  3. [Java] SpringMVC工作原理之四:MultipartResolver
  4. python学习环境安装_python学习系列----环境的安装
  5. 短融网杨夏耘:数据如何驱动金融科技业务升级?
  6. 动态控制jQuery easyui datagrid工具栏显示隐藏
  7. 我为什么用docker-compose来打包开发环境
  8. 工信部证书含金量_关于推荐考取BIM工程师、装配式工程师证书
  9. 转载:SharePoint技术资料
  10. android获取组件id,Android 获取控件id的三种方式
  11. VBS/BAT使用/恶搞(操作+图示)
  12. 泛微协同办公系统移动服务器,泛微协同办公平台Ecology系统重装迁移指导手册.pdf...
  13. Java根据出生日期计算(判断)星座
  14. word文档如何画线条流程图_word怎么画图,如何用word制作流程图
  15. [Python趣味应用]总有人想偷看你电脑?留下证据后办他~~
  16. 如何计算机械能增加量,探讨优化验证机械能守恒定律实验中动能增加量的计算方法...
  17. 一分钟了解什么是代理ip和api接口
  18. 免费小说阅读器(Android版本)全站开源
  19. 7-1 复数类的操作
  20. 解决百度网盘下载慢的方案

热门文章

  1. SpringBoot之第一个Restfu示例
  2. ef core mysql 生成迁移失败_EF Core 数据库迁移(Migration)
  3. layui select change事件_一道2020年全国生物学联赛试题背后的“眼齿鸟事件”
  4. Regional Proposal的输出到底是什么
  5. ERROR: Could not install Gradle distribution from ‘https://services.gradle.org/distributions/gradle
  6. spring无法连接mysql_初学Spring——连接MySQL数据库的问题和解决
  7. 年月日_时间单位年月日是怎么得来的?
  8. 谷歌为什登不上去github_同声传译被攻陷!谷歌发布Translatotron直接语音翻译系统...
  9. idea重写接口没有@override_【自学C#】|| 笔记 19 接口
  10. 常用idea快捷键大全