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

posted @ 2020-05-16 23:04  rookiejavaaa  阅读(608)  评论(0)    收藏  举报