您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Primary Key & Foreign

1. 定义

维基百科:主键(Primary Key)是数据表中每条记录唯一且完整的标识;外键(Foreign Key),又称外来键,是另数据表中的字段。

编程之家解释:主键十分重要,每一张表都应有主键,且主键只能有,主键不能为空;外键用来表示表与表之关系,是关系的核心,一般使用另一张表的主键作为外键。

2. 前言

本小节,我们将学习 中的主键外键

在前面的学习中,我们一直聚焦在 增删查改等操作。对于关系,最核心的东西莫过于关系二字,在开发中,表 A 的主键一般会作为表 B 的外键,来表示表 A 与表 B 之关系。

注意: 在前面的小节中,新建时均未指定主键,但实际上应该为每一张表都指定主键,后面的例子中将践行这条原则。

3. Primary Key

在 CREATE2 一节中,我们介绍了主键的基本。在实际的开发中,主键至关重要,所以一般还需其它约束,如 unsigned、auto_increment 等。

请书写 语句,创建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
);

()创建成功后,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>  |                |
+----------+------------------+------+-----+---------+----------------+

不同的对于自增的是不同的,有些甚至自增主键,Postgre 中使用 serial 类型来自增,如下:

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

4. Foreign Key

外键是一类颇为特殊的字段,既可以像其它普通字段一样存储数据,更可以用来表示表与表之联系,这正是关系的核心所在。

因为主键可以唯一标识一条记录,所以一张表的外键字段一般是另一张表的主键

外键是一种约束,其语法如下:

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

其中col1表示当前表的外键字段名,table_name是另一张数据表,col2表示另一张表的字段。

请书写 语句,创建imooc_user_表,共有 id,user_ 和 user_id 三个字段,其中 id 字段为主键且自增,user_ 表示积分,数据类型为整形,user_id为外键指向 imooc_user 的主键 id。

分析

新建数据表使用 Create 指令,user_ 为基本类型字段,id 作为主键,user_id 为外键。

语句

整理可得语句如下:

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

语句中,user_id 是 imooc_user_ 的字段,同时它也是外键,它的值来源于表 imooc_user 的 id 字段。

()新建成功后,信息如下:

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

若使用 Postgre,新建语句如下:

CREATE TABLE imooc_user_
(
  id serial PRIMARY KEY,
  user_ int,
  user_id int,
  FOREIGN KEY (user_id) REFERENCES imooc_user(id)
);

5. 小结

Postgre 的整型字段 unsigned 无符号,且无自增约束,但有自增数据类型 serial。

大部分场景中,主键一般都为自增字段,当然也有选择uuid作为主键的,但自增主键更加优异。

外键是体现数据表关系的核心点,但主流的外键方式却都是弱外键


联系我
置顶