发布网友 发布时间:2022-05-02 18:12
共2个回答
懂视网 时间:2022-05-02 22:33
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‘); */
数据库系统概念:事务、完整性约束
标签:选择 build void span tom student 语句 执行 mys
热心网友 时间:2022-05-02 19:41
个人觉得完整性约束优先采用,它是保证关系形数据库中的所有数据值均正确的状态。防止数据库中存在不符合语义规定的数据。如主键约束,规定主键唯一性,非空约束,规定关键字段不能为空,外键约束,规定与其他表关联的外键必须是其他表存在的,这些约束能保证任何新数据的创键都是符合规范的。事务更多是应用在批量数据更新的场景,保证同一事务下所有更新要么一起完成,要么一起取消,从而保证数据完整性。事务和完整性约束都是设置好后系统自动执行的,而触发器则需要开发者手动进行约束,通过插入,更新,删除等事件启动开发者自己的代码,更多是用在业务逻辑处理方面而不是约束方面吧