关联表之间的关系:一对多,多对多(需中间表),一对一。
被关联字段永远是唯一的,关联字段则不一定。
1、一对多(最常用)A表中唯一一条记录对应B表中多条记录。“一”的一方是主表(被关联表),“多”的一方是从表(关联表),因此外键设在“多”的一方。
需要关心的:1.保证主表被关联的字段必须唯一(主键或unique约束);
2.保证从表关联字段必须可以重复。
关联方法:在从表(关联表)加一个字段,将其设为外键指向主表唯一性字段。注意二者类型一致。
例:
#===被关联的表===
create table press(
id int primary key auto_increment,
name char(20),
);
#===关联的表===
create table book(
book_id int primary key auto_increment,
book_name varchar(20),
book_price int,
press_id int, #增加1个字段,设为外键
constraint Fk_pressid_id foreign key(press_id) references press(id) on delete cascade on update cascade
);
2、多对多A表中唯一一条记录对应B表中多条记录,反之亦然。如一个作者可以写多本书,一本书也可以有多个作者,双向的一对多,即多对多。
需要关心的:1.保证A、B表被关联字段必须唯一(主键或unique约束);
2.新建一张表,保存A、B表的被关联字段,并且保证新表中的关联字段也必须唯一(主键或unique约束)。
关联方法:在新表中,增加两个字段,作为联合主键或联合唯一,再将该两个字段分别设为外键指向A、B表的唯一性字段。注意类型一致。
例:
#===被关联的表===
create table book1(
id int primary key auto_increment,
name varchar(10),
price float(3,2),
);
#====被关联的表===
create table author(
id int primary key auto_increment,
name char(5),
);
#===关联的表===
create table author2book(
id int primary key auto_increment,
book_id int not null,
author_id int not null, #增加2个字段,联合唯一约束,再分别设为外键
unique(book_id,author_id),
foreign key(book_id) references book1(id) on delete cascade on update cascade,
foreign key(author_id) references author(id) on delete cascade on update cascade
);
3、一对一(最少用)A表和B表的记录最多是一一对应。通常用在数据分割(分割出来的字段肯定和原表字段数据一致)。如用户和管理员(只有管理员才可以登录,一个管理员对应一个用户)。
需要关心的:1.保证主表中的被关联字段必须唯一(主键或unique约束);
2.保证从表中的关联字段也必须唯一(主键或unique约束),这是与“一对多”的区别之处。
关联方法:在从表(关联表)加一个字段,必须设为唯一(主键或unique约束),再将其设为外键指向主表唯一性字段。注意二者类型一致。
例:
#===被关联的表===
create table user(
id int primary key auto_increment,
name char(10),
);
#===关联的表===
create table admin(
id int primary key auto_increment,
user_id int unique, #增加1个字段,设为唯一(区别于“一对多”),再设为外键
password varchar(16),
foreign key(user_id) references user(id) on delete cascade on update cascade
);