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博客