mysql的key和index傻傻分不清楚


                                                           聊一下key与index的区别与联系

key 是数据库的物理结构,它包含两层意义,

一是数据约束(偏重于约束和规范数据库的结构完整性),

二是建立索引(辅助查询用的)

key 包括   primary key 、unique key 、  foreign key、key

1.1  primary key   主键

  • 每个表只能定义一个主键。
  • 主键值必须唯一标识表中的每一行,且不能为 NULL,即表中不可能存在两行数据有相同的主键值。这是唯一性原则。
  • 一个列名只能在复合主键列表中出现一次。
  • 复合主键不能包含不必要的多余列。当把复合主键的某一列删除后,如果剩下的列构成的主键仍然满足唯一性原则,那么这个复合主键是不正确的。这是最小化原则。

1.2 UNIQUE   KEY 唯一键:

  • UNIQUE 约束:唯一标识数据库表中的每条记录。
  • 每个表可以有多个 UNIQUE 约束,
  • 建立UNIQUE 的字段,可以存多个空值,但是只允许一个null值

 上图的username列是unique的设置

1.3  FOREIGN KEY  外键

  • 外键可以是一对一的,一个表的记录只能与另一个表的一条记录连接,或者是一对多的,一个表的记录与另一个表的多条记录连接
  • 外键的使用条件

       ① 两个表必须是InnoDB表,MyISAM表暂时不支持外键

    ② 外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显式建立;

    ③ 外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如int和tinyint可以,而int和char则不可以;

     外键的好处:可以使得两张表关联,保证数据的一致性和实现一些级联操作。

1.4  KEY  普通键

mysql会自动创建该字段的索引,普通的key与普通的index同义

二: index是数据库的物理结构,它只是辅助查询的,它创建时会在另外的表空间(mysql中的innodb表空间)以一个类似目录的结构存            储。索引要分类的话,分为前缀索引、全文本索引等;

因此,索引只是索引,它不会去约束索引的字段的行为(那是key要做的事情)。

当我们在desc 表名; 的时候,有一个Key值,表示该列是否含有索引

我们看到Key那一栏,可能会有4种值,即'啥也没有','PRI','UNI','MUL'
1. 如果Key是空的, 表示该列没有索引, 或者是一个非唯一的复合索引的前导列
2. 如果Key是PRI,  那么该列是主键的组成部分
3. 如果Key是UNI,  那么该列是一个唯一值索引
4. 如果Key是MUL,  那么该列的值可以重复, 该列是一个非唯一索引或者是一个唯一性索引的组成部分但是可以含有空值NULL

在mysql中key会自动创建index,oracle不会