数据库系统概念:事务完整性约束

Posted junjie2019

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库系统概念:事务完整性约束相关的知识,希望对你有一定的参考价值。

public class DataBase {
    public static void main() {

    }
}

/*
    4.3 事务

    事务由查询或更新语句的序列组成。SQL标准规定当一条SQL语句被执行时,就隐式地开始
    了一个事务:
        Commit work:提交当前事务。事务被提交后,一个新的事务自动开始。
        Rollback work:回滚当前事务。

    如果一个事务要执行多条SQL语句,就必须关闭单独SQL语句的自动提交。一个较好的选择是:
    允许多条SQL语句包含在begin atomic 。。。 end之间。所有关键字之间的语句构成一个
    单一事务。
 */

/*
    4.4 完整性约束

    一般来说,一个完整性约束可以是属于数据库的任意谓词。但检测任意谓词的代价可能太高了。
    因此,大多数数据库系统允许用户指定那些只需要极小的开销就可以检测的完整性约束。

    完整性约束被看做是数据库模式设计过程的一部分~
 */

/*
    4.4.1 单个关系上的约束

    not null,unique,check(<谓词>)
 */

/*
    4.4.3 unique约束

    mysql5.7 中说,unique约束是来保证一列中数据不会相同的。

    这儿有:
        unique(a1,a2,a3,...,an)
    unique声明指出了属性a1,a2,a3,...,an形成了一个候选码:即在关系中没有两个元组能
    在所列出的属性上取值相同。
 */

/*
    4.4.4 check子句

    案例:
        create table section
            (course_id varchar(8),
            sec_id varchar(8),
            semester varchar(8),
            year numeric(4.0),
            building varchar(15),
            room_number varchar(7),
            primary_key(course_id,sec_id)
            check(semester in (’Fall‘,‘Winter‘,‘Spring‘,‘Summer‘)));

            怎么说,在MySQL中貌似是一个用enum完成这个功能的。
 */

/*
    4.4.5 参照完整性

    默认情况下,SQL中外码参照的是被参照表中的主码属性。SQL还支持一个可以被显式指定被
    参照关系的属性列表的references子句。然而,这个指定的属性列表必须声明为被参照关系
    的候选码,要么使用primary key约束,要么使用unique约束。在更为普遍的参照完整性约
    束形式中,被参照的属性不必是候选码,这样的形式还能在SQL中直接声明。SQL标准提供了
    另外的结构,用于实现这样的约束~~~

    ********************************************************************
    ********************************************************************

    当违反参照性约束是,通常的处理是拒绝导致完整性破坏的操作(即进行更新操作的事务被回
    滚)。但是,在foreign key子句中可以指明,如果被参照关系上的删除或者更新操作违反了
    约束,那么系统必须采取一些步骤通过修改参照关系中的元组来恢复完整性约束,而不是拒绝
    这样的动作。

    create table course
        (
        foreign key (dept_name) references department
            on delete cascade,
            on update cascade
        );

    由于有了与外码声明相关联的on delete cascade子句,如果删除了department中的元组
    导致了此参照关系完整性被违法,则删除并不会被系统拒绝,而是对course关系做级联“删除”
    类似的,如果更新被参照字段时违反了约束,则更新操作并不被系统拒绝,而是将course中参
    照的元组的dept_name字段也改为新值。SQL还允许foreign key子句指明除cascade以外
    的其他动作,如果约束被违反:可将参照域置为null(用set null代替cascade),或者置为
    域的默认值。

    空值使得SQL中参照约束的语义复杂化了。外码中的属性允许为null,只要它们没有被声明为
    not null。如果给定元组中外码的所有列上均取非空值,则该院组采用外码约束的通常定义
    如果某外码设置为null,则该元组自动被认为满足约束。

    ********************************************************************
    ********************************************************************
 */

/*
    4.4.6 事务中对完整性约束的违反

    为了处理事务中对完整性约束的违反,SQL标准允许将initially deferred子句加入到
    约束声明中:这样完整性约束不是在事务中间步骤上检查,而是在事务结束的时候检查。
    对于声明为可延迟的约束,执行set constraints constraint-list deferred作为
    事务的一部分,会导致对指定约束的检查被延迟到该事务结束时执行。

    可以临时取代的方式是,先插入null,再更新这个null值,前提是数据库允许这样的操作。
 */

/*
    4.4.7 复杂check条件与断言

    一个断言就是一个谓词,它表达了我们希望数据库总能满足的一个条件。域约束和参照
    完整性约束是断言的特殊形式。域约束和参照完整性约束就是断言的特殊形式。

    案例分析:
        1.对于student关系中的每个元组,它在属性tot_cred上的取值必须等于该生所成
        功修完课程的学分总和。
        2.每位教师不能在同一学期的同一时间段在两个教师授课。

    断言语法:
        create assertion <assertion-name> check <predicate>

        create assertion credits_earned_constraint check
            (not exists(
                select ID
                from student
                where tot_cred <>(
                    select sum(credits)
                    from takes natural course
                    where student.ID = takes.ID
                    and grade in not null and grade <>‘F‘);

 */

 

以上是关于数据库系统概念:事务完整性约束的主要内容,如果未能解决你的问题,请参考以下文章

数据库概念与实现

《数据库系统概念》20-恢复系统

NoSQL数据库相关概念

分布式事务介绍

数据库系统概念笔记——第四章:中级SQL

数据库系统第一章绪论(B站视频)