一、主键:
键和外键是把多个表组织为一个有效的关系数据库的粘合剂。
关系数据库依赖于主键—它是数据库物理模式的基石。主键在物理层面上只有两个用途:
1. 惟一地标识一行。
2. 作为一个可以被外键有效引用的对象。
主键没有着明确的概念定义,其是索引的一种,并且是唯一性索引的一种,且必须定义为“PRIMARY KEY”,主键不能重复,一个表只能有一个主键。
主键的声明方法:
可以在创建表的时候就为表加上主键,如:
CREATE TABLE tbl_name ([字段描述省略...], PRIMARY KEY(index_col_name));
也可以更新表结构时为表加上主键,如:
ALTER TABLE tbl_name ADD PRIMARY KEY (index_col_name,…);
在Hibernate中用
@Id
@GeneratedValue
标识。
二、外键
外键是另一表的主键, 外键可以有重复的, 可以是空值,用来和其他表建立联系用的。所以说,如果谈到了外键,一定是至少涉及到两张表。
外键的使用条件:
1.两个表必须是InnoDB表,MyISAM表暂时不支持外键(据说以后的版本有可能支持,但至少目前不支持);
2.外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显示建立;
3.外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如int和tinyint可以,而int和char则不可以;
外键的好处:可以使得两张表关联,保证数据的一致性和实现一些级联操作;
添加外键的方法:
1.在创建表的时候进行添加
[CONSTRAINT symbol] FOREIGN KEY [id] (从表的字段1) REFERENCES
tbl_name (主表的字段2) [ON DELETE {RESTRICT | CASCADE | SET NULL
| NO ACTION}][ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION}
CONSTRAINT symbol:可以给这个外键约束起一个名字,有了名字,以后找到它就很方便了。
如果不加此参数的话,系统会自动分配一个名字。
FOREIGN KEY:将从表中的字段1作为外键的字段。
REFERENCES:映射到主表的字段2。
ON DELETE后面的四个参数:代表的是当删除主表的记录时,所做的约定。
RESTRICT(限制):如果你想删除的那个主表,它的下面有对应从表的记录,此主表将无法删除。
CASCADE(级联):如果主表的记录删掉,则从表中相关联的记录都将被删掉。
SET NULL:将外键设置为空。
NO ACTION:什么都不做。
注:一般是RESTRICT和CASCADE用的最多。
2.表已经创建好了,继续修改表的结构来添加外键。
ALTER TABLE employee ADD FOREIGN KEY(dept_id) REFERENCES department(id);
ALTER TABLE employee:在从表employee中进行操作;
ADD FOREIGN KEY(dept_id):将从表的字段dept_id添加为外键;
REFERENCES department(id):映射到主表department当中为id的字段。
关于外键的使用,可以参考 其在Hibernate中的使用:
/**
* 合同检测机构
*/
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="cto_id") //这里设置JoinColum设置了外键的名字
private To cto;
三、索引
索引是数据库中用来提高查询性能的最常用工具。
在使用以下操作符时,都会用到相关列上的索引:
>、<、>=、<=、<>、IN、 BETWEEN
LIKE 'pattern'(pattern不能以通配符开始,即通配符不能放前面,即使放在了前面,索引也无效)
注:索引的值因为不断改变,所以是它需要维护的。如果数据量较少,建议不用索引。
创建索引:
1.直接创建索引
2.修改标识添加索引
3.创建表的时候指定索引
主要是用 index 标识列名。
需要注意的是:主键、外键也是索引的一种,在创建主键的时候,数据库会直接创建其索引,创建外键时,早起的
数据库版本需要先创建索引。