复合主键

1.原因:当数据库创建表时,每个表只能有一个主键,但是如果想让多个列都成为主键时,就要用到复合主键。  

   条件:a.必须实现Serializable接口。  

           b.必须有默认的public无参数的构造方法。  

           c.必须覆盖equals和hashCode方法。equals方法用于判断两个对象是否相同,EntityManger通过find方法来查找Entity时,是根据equals的返回值来判断的。  

本例中,只有对象的name和email值完全相同时或同一个对象时则返回true,否则返回false。hashCode方法返回当前对象的哈希码,生成的hashCode相同的概率越小越好,算法可以进行优化。

2.主键唯一约束性:也就是说不允许有相同的值出现。对于复合主键而言,复合主键创建的约束指的是不允许   充当主键的列值都分别重复出现的数据插入。  

例:CREATE TABLE T ( ID NUMBER, NAME VARCHAR2(10), constraint t_pk primary key (ID) );  table T 已创建。 INSERT INTO T VALUES(1,'A'); 1 行已插入。 insert into T VALUES(1,'B'); SQL 错误: ORA-00001: 违反唯一约束条件 (TEST.T_PK)

3.主键的索引  当创建主键时Oracle会自动创建索引。

复合索引实用的条件为当where条件中存在复合索引的第一列时,才使用索引。也就是说第二个查询语句中没有 包含REPOLICYNO所以Oracle没有使用复合索引。至于为什么必须有第一列,个人认为由于Oracle默认是使用 B*树索引,而B树的复合索引指向的是第一列的元素索引,如果不包括第一列则无法找到索引源头从而无法使用 索引。

复合索引要快于单独建立索引。

优缺点:1、如果有频繁的业务修改,其相应主键字段有修改的可能。会导致非聚集索引中的主键信息相应修改(假如主键默认为   聚集索引),而且容易造成表中记录的物理移动。

           2、可能导致业务信息外泄。  

           3、生成有业务含义的字段需要按照一定的规则生成,不可避免使用varchar等字符串类型,影响插入和查询效率。  

    4、业务规则发生变化,造成的影响容易扩大。

posted @ 2013-08-30 12:40  High阔天空  阅读(1193)  评论(0编辑  收藏  举报