聊一下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不會