【MySQL】MySQL中的主键约束和外键约束,父子表的创建与删除

本文详细解释了SQL中主键、唯一键和外键的概念,包括它们的定义、约束条件以及在数据库设计中的应用。同时,提及了Java工程师提升技能面临的挑战和提供的一份全面的学习资料包,涵盖了Java开发的各个核心知识点和视频资源。
摘要由CSDN通过智能技术生成

create table stu

(

sno int primary key,

sname VARCHAR(5),

cno int,

FOREIGN key(cno) REFERENCES class(cno)

);

不然会报错:

正确删除方式:

3.主键:非空且唯一

==========

主键一个表中只能有一个,可以有表级约束,也可以有列级约束。

主键就是非空约束(not null) 和 唯一性约束(unique)两者的结合

表级约束就是两个或者多个字段连起来 满足 上述要求!

主键的定义语句

sno int primary key;//列级约束,对学号这一字段(列,columu)进行约束,要求不为空且不能重复!

primary key(sno);//一个字段也可以这样使用表级约束,但是意义不大

primary key(name,id);//姓名和身份证号连起来,作为主键

尽管支持多个字段联合起来作为联合主键。

但是顺嘴提一句,并不推荐这样,实际业务中

第一范式就要求非主键不能对主键存在部分依赖。复合主键完美破解第一范式!

主键常用两种:

1,业务主键 业务主键是和业务挂钩的,数据重用效率低,业务发生变更太复杂,和业务有关,

2,自然主键 推荐使用自然主键,自然主键是和业务无关,自己玩自己的,业务变更不影响对数据的使用

其中自然主键非常常用,且提到自然主键,不得不提到主键值自增,

如:在我们插入数据时,可以不管(自然主键),插入一条数据,主键值自动增长。

insert into class

(cname)

VALUES

(‘jd’),(‘jz’),(‘gk’);

select * from class;

insert into stu

(sname,cno)

VALUES

(‘cwq’,1),(‘ljb’,2),(‘cyc’,3);

select * from stu;

执行上述语句结果如下:

原因是我们在定义主键值的时候加入了这样一句话:

cno int primary key auto_increment;

auto_increment,主键值自增

4.外键:关联其他表的主键或唯一值

=================

外键的约束条件

首先,外键是本表中的字段,本表是子表,通常外键引用父表的主键

但是当外键引用的是父表不为主键的字段

此时外键所约束的列,可以有一个或多个null同时出现 因为null不是值,不存在重复。

即可以不满足非空约束,但要求仍然满足unique的唯一性约束,不能有重复

外键:一言以蔽之:关联其他表的主键或唯一值

外键的声明语法:

foreign key(字段名) references 主表表名(列的字段名)

foreign key(字段名) references 主表表名(列的字段名)

不能向子表的外键所在列中插入父表对应列中不存在的元素!

[ SQL ]

插入到 stu (cno)值(7)中;

[ Err ]1452-无法添加或更新子行: 外键约束失败(‘ srs’)。‘ stu’,CONSTRAINT‘ stu _ ibfk _ 1‘ FOREIGN KEY (‘ cno’) REFERENCES‘ class’(‘ cno’))

[SQL]

insert into stu(cno) values(7);

[Err] 1452 - Cannot add or update a child row: a foreign key constraint fails (srs.stu, CONSTRAINT stu_ibfk_1 FOREIGN KEY (cno) REFERENCES class (cno))

一个表中不限制外键的个数,但是子表中的列引用父表中的对应列,对应列 约束 应为主键约束或者唯一约束

解决方法:因为外键关联其他表的字段需要是主键,或者至少应满足唯一约束,因此加上唯一约束即可;

drop table if exists stu;

drop table if exists class;

create table class

(

cno int primary key auto_increment,

cname VARCHAR(5) unique

);

create table stu

(

sno int PRIMARY key auto_increment,

sname VARCHAR(10),

major VARCHAR(10),

cno int ,

cname VARCHAR(5),

FOREIGN key (cno) references class(cno),

foreign key (cname) references class(cname)

);

insert into class

(cname)

VALUES

(‘jd’),(‘jz’),(‘gk’),(‘gygc’);

select * from class;

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

更多:Java进阶核心知识集

包含:JVM,JAVA集合,网络,JAVA多线程并发,JAVA基础,Spring原理,微服务,Zookeeper,Kafka,RabbitMQ,Hbase,MongoDB,Cassandra,设计模式,负载均衡,数据库,一致性哈希,JAVA算法,数据结构,加密算法,分布式缓存等等

image

高效学习视频

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
oom: 33%;" />

更多:Java进阶核心知识集

包含:JVM,JAVA集合,网络,JAVA多线程并发,JAVA基础,Spring原理,微服务,Zookeeper,Kafka,RabbitMQ,Hbase,MongoDB,Cassandra,设计模式,负载均衡,数据库,一致性哈希,JAVA算法,数据结构,加密算法,分布式缓存等等

[外链图片转存中…(img-WYaXge5V-1713532861213)]

高效学习视频

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值