mysql的主键与外键的理解

一、主键与外键存在的意义

定义主键和外键主要是为了维护关系数据库的完整性,总结一下:

1、主键是能确定一条记录的唯一标识,比如,一条记录包括身份正号,姓名,年龄。

身份证号是唯一能确定你这个人的,其他都可能有重复,所以,身份证号是主键。不能有重复的,不允许为空

2、外键用于与另一张表的关联。是能确定另一张表记录的字段,用于保持数据的一致性。

比如,A表中的一个字段,是B表的主键,那他就可以是A表的外键。表的外键是另一表的主键, 外键可以有重复的, 可以是空值

3、索引:该字段没有重复值,但可以有一个空值 

二、主键、外键和索引的区别

作用:

 主键:用来保证数据完整性

 外键:用来和其他表建立联系用的

 索引:是提高查询排序的速度

个数:

主键:主键只能有一个

外键:一个表可以有多个外键

索引:一个表可以有多个唯一索引

外键必须是另一个表的主键吗 ?

不一定是主键,但必须是唯一性索引。
主键约束和唯一性约束都是唯一性索引。
外键是表间关系的参照,可以不是主键。只是表明两个表之间的关系是通过那个属性连接起来的。

三、primary key 和 foregin key 的运用

外键的使用场景

因为有foreign key的约束,使得两张表形成了三种了关系:

1、书和出版社(一对多或多对一)

  一个出版社可以出版多本书,一本书也可以被多家出版社书版

  关联方式:foreign key

创建出版社表

mysql> create table press(id int primary key auto_increment,name varchar(20)); 

创建书籍表

mysql> create table book(
    id int primary key auto_increment, \
    name varchar(20), \
    press_id int not null, \
    constraint fk_book_press foreign key(press_id) references press(id)  on delete cascade  on update cascade);

注意:

on delete cascade 和 on update cascade的意思是:在父表上update/delete记录时,同步update/delete子表的匹配记录 ;

MySQL通过外键约束实现数据库的参照完整性,外键约束条件可在创建外键时指定,table的存储引擎只能是InnoDB,因为只有这种存储模式才支持外键。
 
外键约束条件有以下4种:
 
(1)restrict方式:同no action,都是立即检查外键约束;
 
         - - 限制,指的是如果子表引用父表的某个字段的值,那么不允许直接删除父表的该值。
 
(2)cascade方式:在父表上update/delete记录时,同步update/delete子表的匹配记录 ;
 
         On delete cascade从mysql3.23.50开始可用,on update cascade从mysql4.0.8开始可用 ;
 
         -- 级联,删除/更新父表的某条记录,子表中引用该值的记录会自动被删除/更新。
 
(3)No action方式:如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作 这个是ANSI SQL-92标准,从mysql4.0.8开始支持;
 
         --无参照完整性关系,有了也不生效。
 
(4)set null方式:在父表上update/delete记录时,将子表上匹配记录的列设为null 要注意子表的外键列不能为not null 
 
         On delete set null从mysql3.23.50开始可用;,on update set null从mysql4.0.8开始可用 

插入出版社记录

mysql> insert into press(name) values('北京工业地雷出版社'),('人民音乐不好听出版社'),('知 识产权没有用出版社');

插入书籍记录

mysql> insert into book(name,press_id) values('九阳神功',1),('九阴真经',2),('九阴白骨爪',2),('独孤九剑',3),('降龙十巴掌',2),('葵花宝典',3);

2、作者和书籍的关系

  多对多:一个作者可以写多本书,一本书也可以有多个作者,双向的一对多,即多对多。

  关联方式:foreign key+一张新的表

3、用户和账号

  一对一:一个用户只能注册一个账号,即一对一的关系

  关联方式:foreign key+unique

创建用户表

mysql> create table user(id int primary key auto_increment,name varchar(20));

创建博客表

mysql> create table blog(id int primary key auto_increment,url varchar(100),user_id int unique,constraint fk_user foreign key(user_id) references user(id) on delete cascade on update cascade); 

插入用户表中的记录

mysql> insert into user(name) values('alex'),('wusir'),('egon'),('xiaoma'); 

插入博客表的记录

mysql> insert into blog(url,user_id) values('http://www.zhangsan.com',1),('http://www.lisi.com',2),('http://www.wangwu.com',3),('http://www.zhuliu.com',4);

查询lisi的博客地址

mysql> select url from blog where user_id=2;

+---------------------+

| url                 |

+---------------------+

| http://www.lisi.com |

+---------------------+

1 row in set (0.00 sec)

四、练习

1、创建一个表用来引用外键

create table class(
   -> id  int not null primary key,
   ->  (16));

2、创建一个表,使用外键引用

CREATE TABLE `student3` (
`id` int(11) NOT NULL,
`day` int NOT NULL,
`status` char(32) NOT NULL,
'stu_id' int(11) not null,
PRIMARY KEY (`id`),
KEY `fk_student_key` (`stu_id`),
CONSTRAINT `fk_student_key` FOREIGN KEY (`stu_id`) REFERENCES `xxx` (`id`));

注意:

PRIMARY KEY设置主键 ('设置的主键字段'), 

KEY `自定义KEY名` (`定义外键字段名`), 

CONSTRAINT限制 `自定义KEY名` FOREIGN KEY外键 (`自定外键字段名`) REFERENCES 引用 `引用表` (`引用字段设为外键`));

如果student表中跟这个class表有关联的数据,是不能删除class表中与其关联的纪录的。

 

 

 

 

MySQL外键约束_ON DELETE CASCADE/ON UPDATE CASCADE(级联删除,删除主表数据,附表数据也被删除)_Marttin2的博客-CSDN博客 

mysql-外键的三种关系 (py3study.com)

 

posted @ 2022-07-12 15:15  凡人半睁眼  阅读(3876)  评论(0编辑  收藏  举报