mysql关于外键的引用_MySQL学习——关于外键foreign key的三种用法

本节主要讲述外键的变种:

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().

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值