1. 程式人生 > SQL入門教學 >19 Primary Key & Foreign

19 Primary Key & Foreign

1. 定義

維基百科:主鍵(Primary Key)是資料表中每條記錄唯一且完整的標識;外來鍵(Foreign Key),又稱外來鍵,是另一個數據表中的欄位。

解釋:主鍵十分重要,每一張表都應有一個主鍵,且主鍵只能有一個,主鍵不能為空;外來鍵用來表示表與表之間的關係,是關係資料庫的核心,一般使用另一張表的主鍵作為外來鍵。

2. 前言

本小節,我們將學習 SQL 中的主鍵外來鍵

在前面的學習中,我們一直聚焦在 SQL 增刪查改等操作。對於關係資料庫,最核心的東西莫過於關係二字,在開發中,表 A 的主鍵一般會作為表 B 的外來鍵,來表示表 A 與表 B 之間的關係。

注意: 在前面的小節中,新建資料庫時均未指定主鍵,但實際上應該為每一張表都指定一個主鍵,後面的例子中將踐行這條原則。

3. SQL Primary Key

SQL CREATE2 一節中,我們介紹了主鍵的基本用法。在實際的開發中,主鍵至關重要,所以一般還需加上其它約束,如 unsigned、auto_increment 等。

3.1 例1 建立使用者表

請書寫 SQL 語句,建立imooc_user表,共有 id,username 和 age 三個欄位,其中 id 為主鍵,資料型別為 unsigned int 且自增,username 為 varchar 型別,age 表示年齡,為 int 型別。

分析

新建資料表使用 Create 指令,username 和 age 為基本型別欄位,id 作為主鍵,欄位型別為無符號整型,且自增,故該欄位需要新增 auto_increment 約束。

語句

整理可得語句如下:

CREATE TABLE imooc_user
(
  id int unsigned PRIMARY KEY AUTO_INCREMENT,
  username varchar(20),
  age int
);

(MySQL資料庫)建立成功後,imooc_user表資訊如下:

+----------+------------------+------+-----+---------+----------------+
| Field    | Type             | Null | Key | Default | Extra          |
+----------+------------------+------+-----+---------+----------------+
| id       | int(10) unsigned | NO   | PRI | <null>  | auto_increment |
| username | varchar(20)      | YES  |     | <null>  |                |
| age      | int(11)          | YES  |     | <null>  |                |
+----------+------------------+------+-----+---------+----------------+

不同的資料庫對於自增的支援是不同的,有些資料庫甚至不支援自增主鍵,PostgreSQL 中使用 serial 型別來支援自增,如下:

CREATE TABLE imooc_user
(
  id serial PRIMARY KEY,
  username varchar(20),
  age int
);

4. SQL Foreign Key

外來鍵是一類頗為特殊的欄位,既可以像其它普通欄位一樣儲存資料,更可以用來表示表與表之間的聯絡,這正是關係資料庫的核心所在。

因為主鍵可以唯一標識一條記錄,所以一張表的外來鍵欄位一般是另一張表的主鍵

外來鍵是一種約束,其語法如下:

FOREIGN KEY ([col1]) REFERENCES [table_name]([col2])

其中col1表示當前表的外來鍵欄位名,table_name是另一張資料表名稱,col2表示另一張表的欄位名稱。

4.1 例2 建立使用者積分表

請書寫 SQL 語句,建立imooc_user_score表,共有 id,user_score 和 user_id 三個欄位,其中 id 欄位為主鍵且自增,user_score 表示使用者積分,資料型別為整形,user_id為外來鍵指向 imooc_user 的主鍵 id。

分析

新建資料表使用 Create 指令,user_score 為基本型別欄位,id 作為主鍵,user_id 為外來鍵。

語句

整理可得語句如下:

CREATE TABLE imooc_user_score
(
  id int unsigned PRIMARY KEY AUTO_INCREMENT,
  user_score int,
  user_id int unsigned,
  FOREIGN KEY (user_id) REFERENCES imooc_user(id)
);

SQL 語句中,user_id 是 imooc_user_score 的欄位,同時它也是外來鍵,它的值來源於表 imooc_user 的 id 欄位。

(MySQL)新建成功後,資訊如下:

+------------+------------------+------+-----+---------+----------------+
| Field      | Type             | Null | Key | Default | Extra          |
+------------+------------------+------+-----+---------+----------------+
| id         | int(10) unsigned | NO   | PRI | <null>  | auto_increment |
| user_score | int(11)          | YES  |     | <null>  |                |
| user_id    | int(10) unsigned | YES  | MUL | <null>  |                |
+------------+------------------+------+-----+---------+----------------+

若使用 PostgreSQL,新建語句如下:

CREATE TABLE imooc_user_score
(
  id serial PRIMARY KEY,
  user_score int,
  user_id int,
  FOREIGN KEY (user_id) REFERENCES imooc_user(id)
);

5. 小結

  • PostgreSQL 的整型欄位不支援 unsigned 無符號,且無自增約束,但有自增資料型別 serial。
  • 大部分場景中,主鍵一般都為自增欄位,當然也有選擇uuid作為主鍵的,但自增主鍵效能更加優異。
  • 外來鍵是體現資料表關係的核心功能點,但主流的外來鍵方式卻都是弱外來鍵