not null是针对单列的 unique,primary key是针对列的集合的 unique时null与null被认为是不同的,是被允许的,但在部分为null的复合唯一完整性约束时,考虑是否唯一时是不考虑都为null值的列的,也就是说 假如unique(a,b) a b null 1 null 1 就被认为是违反唯一完整性约束的,而不是说a的两行null和null是不相同的,所以(null,1)和(null,1)也就不相同,所以不违反唯一约束了,不是这样的!(21-11) 唯一完整性约束会自动的通过唯一索引来实现 21-11:主键约束不仅是unique的,而且要求所有列都是not null的 oracle通过unique index和not null约束来加强主键约束 21-13:外键引用的是主键/唯一键,也可以是部分或者全部null,要求数量和数据类型完全相同 21-15:如果复合外键的任何一列是null的话,那么这个复合外键的其它非null部分可以不匹配父键的任何相应部分 21-17:有关外键索引的并发控制 如果外键上没有索引, 那么在8I中,当对父表的主键执行update/delete时,子表是TM-4,子表指定on delete cascade时,子表是TM-5,直到对父表的事务提交时为止;对父表insert时,子表上不加任何的表级锁 在9I中,是同上的,但是语句执行前获得,语句执行完成后,立即释放,而不是持续为整个事务期间 如果外键上有索引,对父表的任何操作都不会对子表加任何的TM锁 21-21:check约束要求检查条件是true/unknown的,不能是false的 21-22:完整性约束的检查时机是语句执行完成之后,如果违反,语句被回滚(这是默认情况,立即,不推迟) 推迟的完整性约束检查,是在事务提交时,如果违反,事务被回滚. 如果约束导致一动作(比如说级联删除),那么这个动作始终是作为语句的一部分执行的,而不管约束的检查时机. 21-26: enable:对新插入/更新的数据进行完整性检查 disable:对新插入/更新的数据不进行完整性检查 validate:确保存在的数据符合完整性约束 novalidate:存在的数据可以有些不符合完整性约束 它们的组合状态可以有一些