本节主要讲述外键的变种:
create database db1;
//先创建表
create table t1(
uid int auto_increment primary key,
name char(16),
department_id int)
engine=innodb default charset=utf8;
一、关于MySQL的唯一索引:
1、首先讲一讲MySQL唯一索引;所谓唯一索引,有2个内容:1,唯一:表示约束功能;2,索引:表示加速查找。
情况一:
create table t1(
uid int auto_increment primary key,
num int,
unique uql(num)//约束了num的的唯一性;
)engine=innodb default charset=utf8;
情况二:
create table t1(
uid int auto_increment primary key,
num int,
xxx int,
unique uql(num,xxx)
)engine=innodb default charset=utf8;
//这里的 unique uql(num,xxx)是联合唯一,什么是联合唯一,就是保证一组(num,xxx)与本表中的其他组(num,xxx)不一样;
2、关于外键的变种:
a 假设我有2个表:(以博客园举例)用户表与博客表
用户:id name
1 Alex
2 root
3 egon
4 laoyao
博客(并不是所有的用户都有博客,有点人没有申请就没有)
bid blog_adress uid (fk()+唯一)
1 /yunchengqi/ 4
2 /alex3714/ 1
3 /xxxxxxxx/ 1 //假设Alex有2个博客;
//但是博客园是不允许一个用户有多个博客的,一人一个; 这里的uid作为fk.对博客表加上一个外键约束
那么当我将只用外键关联到用户表上时,是不能解决1个用户有多个博客这个问题的;
所以这里要在博客表上的uid列用唯一索引,这样就约束了每一个地址对应1个用户;
------》》》》这样的情况就是一对一
b 用户表与部门表
用户:
id name department_id (fk())
1 Alex 1
2 root 1
3 egon 2
4 laoyao 3
部门:
1 服务
2 保安
3 公关
------》》》》这样的情况就是一对多
c 用户表与相亲表(多对多),拿百合网来举例子:
用户表
相亲表
//双向的一对多就是多对多。
用户表
create table userinfo(
uid int auto_increment primary key,
name char(16)),
email verchar(16)
engine=innodb default charset=utf8;
主机表
create table hostinfo(
hid int auto_increment primary key,
name char(16))
engine=innodb default charset=utf8;
然后创建一个用户主机表,将二者关联起来
create table user2host(
id int auto_increment primary key,
user_uid int,
host_hid int,
unique uq_user_host(user_uid,host_hid),
constraint fk_user_uid foreign key (user_uid) references userinfo(uid),
constraint fk_host_hid foreign key (host_hid) references hostinfo(hid))
engine=innodb default charset=utf8;
//这是双向的fk().