【如何成为SQL高手】第四关:完整性约束

【如何成为SQL高手】第四关:完整性约束,第1张

【如何成为SQL高手】第四关:完整性约束
‍ 博主介绍:
IT邦德,江湖人称jeames007,10年DBA工作经验
中国DBA联盟(ACDU)成员,目前从事DBA及程序编程

SQL对于现在的互联网公司产研岗位几乎是一个必备技能,但仅会SQL的话,应该是什么都做不了。
1.如果你是数据分析师,你需要熟练地把自己脑子里的数据和指标需求翻译成SQL逻辑去查询数据,进而完成自己的数据分析报告等,你的产出是分析报告,而不是SQL代码;
2.如果你是数仓工程师(偏应用层),你需要根据业务逻辑去设计模型,编写调度任务去产出数据,以供业务人员使用,你的产出是数据模型和表;
3.如果你是算法工程师,你可能需要用SQL来实现用户标签、特征工程等工作,但是这些是为你的模型训练评估做基础准备工作,你的产出是可以提升某些指标的算法模型。

所以,SQL每个人都要用,但是用来衡量产出的并不是SQL本身,你需要用这个工具,去创造其它的价值。
IT邦德老师带你成为SQL高手,那我们开始吧~

文章目录

1.约束创建

1.1 表级完整性约束1.2 列级完整性约束1.3 级联更新删除1.4 外键 2.完整性约束更新3.技能拓展3.1 约束类型

1.约束创建 1.1 表级完整性约束

按照如下表结构创建tb_student数据表,
要求以表级完整性约束方式定义主键,并指定主键约束名为pk_student

CREATE TABLE tb_student (
 studentNo CHAr(10) NOT NULL,
 studentName VARCHAr(10) NOT NULL,
 sex CHAr(2),
 birthday DATE, 
 native VARCHAr(20),
 nation VARCHAr(20) default '汉',
 classNo CHAr(6),
 constraint pk_student primary key(studentNo)
) engine=InnoDB default charset=gb2312;
1.2 列级完整性约束

按照如下的表结构创建tb_class。
要求:使用InnoDB存储引擎,gb2312字符集,主键约束为列级完整性约束,
唯一约束为表级完整性约束其约束名为uq_class

CREATE TABLE tb_class (
 classNo CHAr(6) PRIMARY KEY NOT NULL,
 className VARCHAr(20) NOT NULL,
 department VARCHAr(20),
 grade ENUM('1','2','3','4'), 
 classNum TINYINT,
 constraint uq_class unique(className)
) engine=InnoDB default charset=gb2312;
1.3 级联更新删除
删除数据表tb_student,按照表tb_student结构重新创建tb_student,
在创建的同时建立tb_student到tb_class的外键约束
(两个表相同含义的属性是classNo,
因此classNo是tb_student的外键),
约束名为fk_student,
并定义相应的参照动作,更新 *** 作为级联(cascade),
删除 *** 作为限制(restrict),数据表引擎为InnoDB,字符集为gb2312

drop table tb_student;

CREATE TABLE tb_student (
 studentNo CHAr(10) NOT NULL,
 studentName VARCHAr(10) NOT NULL,
 sex CHAr(2),
 birthday DATE, 
 native VARCHAr(20),
 nation VARCHAr(20) default '汉',
 classNo CHAr(6),
 constraint fk_student FOREIGN KEY (classNo)
 references tb_class(classNo) on delete restrict on update cascade
) engine=InnoDB default charset=gb2312;

1.4 外键

按照如下表结构创建tb_course表,
要求:外键名字为fk_course,引擎为InnoDB,默认字符集为gb2312

CREATE TABLE tb_course (
 courseNo CHAr(6) NOT NULL primary key comment '课程号',
 courseName VARCHAr(20) unique not NULL comment '课程名',
 credit DECIMAL(3,1) not NULL comment '学分',
 courseHour TINYINT(2) not NULL comment '课时数', 
 term TINYINT(2) comment '开课学期',
 priorCourse CHAr(6) comment '先修课程',
 constraint fk_course FOREIGN KEY(priorCourse) REFERENCES tb_course(courseNo)
) engine=InnoDB default charset=gb2312;

定义数据表tb_score,表结构如下表所示, 创建对应的外键
引擎为InnoDB,默认字符集为gb2312

Alter table tb_student add primary key(studentNo);   --添加主键

CREATE TABLE tb_score(
 studentNo CHAr(10) NOT NULL comment '学号',
 courseNo CHAr(6) NOT NULL comment '课程号',
 credit DECIMAL(4,1) not NULL comment '成绩',
 constraint fk_score_stuNo FOREIGN KEY(studentNo) REFERENCES tb_student(studentNo),  
 constraint fk_score_courNo FOREIGN KEY(courseNo) REFERENCES tb_course(courseNo),
 constraint pk_score PRIMARY KEY(studentNo,courseNo)
) engine=InnoDB default charset=gb2312;

注意:外键约束对应的主键(在表里是主键才可以)

2.完整性约束更新

删除在表tb_score中定义的外键约束fk_score_stuNo
alter table tb_score drop foreign key fk_score_stuNo;

删除在表tb_student中定义的主键约束。
Alter table tb_student drop primary key;

添加主键约束,用alter table语句在tb_student对studentNo重新添加主键。
Alter table tb_student add primary key(studentNo);

添加外键约束,用alter table语句在tb_score表对studentNo重新添加外键,
的主键为tb_student表的studentNo,外键名称为fk_score_stuNo。
ALTER TABLE tb_score ADD ConSTRAINT fk_score_stuNo FOREIGN KEY(studentNo) REFERENCES tb_student(studentNo);

3.技能拓展 3.1 约束类型
约束主要完成对数据的检验,保证数据库数据的完整性;如果有相互依赖数据,保证该数据不被删除。
常用五类约束:
1. not null:非空约束,指定某列不为空
2. unique: 唯一约束,指定某列或几列组合的数据不能重复
3. primary key:主键约束,指定某列或几列组合的数据非空且唯一
4. foreign key:外键,指定该列记录属于主表中的一条记录,参照另一条数据
5. check:检查,指定一个表达式,用于检验指定数据

大家点赞、收藏、关注、评论啦 微信公众号

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5715405.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-18

发表评论

登录后才能评论

评论列表(0条)

保存