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开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
更多:Java进阶核心知识集
包含:JVM,JAVA集合,网络,JAVA多线程并发,JAVA基础,Spring原理,微服务,Zookeeper,Kafka,RabbitMQ,Hbase,MongoDB,Cassandra,设计模式,负载均衡,数据库,一致性哈希,JAVA算法,数据结构,加密算法,分布式缓存等等
高效学习视频
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
oom: 33%;" />
更多:Java进阶核心知识集
包含:JVM,JAVA集合,网络,JAVA多线程并发,JAVA基础,Spring原理,微服务,Zookeeper,Kafka,RabbitMQ,Hbase,MongoDB,Cassandra,设计模式,负载均衡,数据库,一致性哈希,JAVA算法,数据结构,加密算法,分布式缓存等等
[外链图片转存中…(img-WYaXge5V-1713532861213)]
高效学习视频
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!