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、业务规则发生变化,造成的影响容易扩大。