MySQL之关系映射
数据库的关系一般是用于描述多张表之间的关系。
主要分为:
- 一对一
- 一对多
- 多对多
而不管表与表之间是哪种关系,在创建关联时都需要通过外键(FOREIGN KEY)进行约束,以保证数据的统一性。外键通常都是与另一张表的主键进行关联的。
一、一对一关系
一对一关系是指一张表中的一条数据对应另一张表中的唯一一条数据。
例如下面的用户与用户详情表。
用户表:
CREATE TABLE user(
id INT UNSIGNED PRIMARY KEY,
name VARCHAR(12),
phone CHAR(15)
)CHARSET=UTF8;
用户详情表:
CREATE TABLE userinfo(
id INT UNSIGNED PRIMARY KEY,
address VARCHAR(255),
uid INT UNSIGNED UNIQUE,
FOREIGN KEY(uid) REFERENCES user(id)
)CHARSET=UTF8;
一般而言,一个用户对应一个用户详情。所以在创建用户详情表时,添加外键的字段需要设置唯一(UNIQUE)约束。
二、一对多关系
与上面的一对一关系类似,一对多关系是指一张表中的一条数据,对应另一张表中的多条数据。
例如下面的父子表。
父亲表:
CREATE TABLE father(
id INT UNSIGNED PRIMARY KEY,
name VARCHAR(12),
phone CHAR(15)
)CHARSET=UTF8;
子女表:
CREATE TABLE child(
id INT UNSIGNED PRIMARY KEY,
name VARCHAR(12),
gender CHAR(10),
pid INT UNSIGNED,
FOREIGN KEY(pid) REFERENCES father(id)
)CHARSET=UTF8;
三、多对多关系
多对多关系是指一张表中的多条数据对应另一张表中的多条数据。
与上面一对一关系和一对多关系不同的是多对多需要一张关系表来描述两张表的关系,主表和从表没有直接关系,主表和关系表是一对多关系,从表和关系表也是一对多的关系。
例如下面的专业与课程:
专业表:
CREATE TABLE major(
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
name CHAR(10),
)CHARSET=UTF8;
课程表:
CREATE TABLE course(
id INT UNSIGNED AUTO_INCREMENT PEIMARY KEY,
name CHAR(10)
)CHARSET=UTF8;
关系表:
CREATE TABLE m_c(
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
mid INT UNSIGNED,
cid INT UNSIGNED,
FOREIGN KEY(mid) REFERENCES major(id),
FOREIGN KEY(cid) REFERENCES course(id)
)CHARSET=UTF8;
四、外键约束
在创建表与表之间的关系映射时,外键是必不可少的约束字段。通过上面的例子可以总结出外键的语法是:
FOREIGN KEY(当前表的外键字段) REFERENCES 关联表名(关联表字段)
一般而言关联表字段通常都是关联表的主键字段。
在创建外键约束时,要注意的是必须要先有外键字段,之后才能添加约束,而且外键字段的类型必须要和关联字段的类型保持一致。添加外键只是添加了一个约束,并不是添加新的字段。
查看表的字段以及字段类型的相关信息时。可以使用下面的语法:
DESC 表名;
外键约束也可以给已经存在的表添加。
语法:
ALTER TABLE 表名 ADD FOREIGN KEY(外键字段) REFERENCES 关联表名(关联表主键字段);
外键约束也是可以删除的。
语法:
ALTER TABLE 表名 DROP FOREIGN KEY 外键的名字;
外键的名字再添加外键约束时,系统会自动命名。可以通过查看建表语句进行查看。
SHOW CREATE TABLE 表名\G;
在MySQL数据库中,\G指的是将结果格式化输出。