当前位置: 首页 > article >正文

初写MySQL四张表:(2/4)

今天,我们来写第二张表。因着这四张表以及后续有相应的拓展,这四张环环相扣,所以还未写出第一张表的同学,可以看完第一张表,再来此处:

初写MySQL四张表:(1/4)-CSDN博客


好,今日表格有三张:——主要学会了创建表,都可以依葫芦画瓢

先来分析这张表:

表名: Stu,但是在创建表的时候需要确定它依附的数据库testdb.stu。(具体信息见第一张表)。

字段:5条字段(COLUMN),我们又理解成表名(学生)的属性:有学号、姓名、性别、出生日期和学院编号。

字段的添加,还要包括数据的类型,大小以及中文备注,最后一列是给这个字段的特殊约束:一般是主键、非空又或者外键。

根据上一张表的基础,我们先把能写的写出来:

CREATE TABLE testdb.stu
(

);
#先写个框架,这是好习惯:不容易丢分号

还记得CREATE后面接数据库对象,以及数据库吗?这也是为什么这里要加TABLE的原因。

CREATE是操作数据库以及数据库对象的关键字之一:其他的关键字,我们不久后就会遇见。

添加字段:(这里我再写个我觉得更好的写法)

推荐写法——添加字段

CREATE TABLE testdb.stu
(
   stuid CHAR(10) COMMENT'学号' PRIMARY KEY,
   stuname VARCHAR(40) COMMENT '姓名' NOT NULL,
   sex CHAR(1) COMMENT'性别',
   birthday DATE COMMENT'出生日期',
   #...
);

跟我上一张表,选择的方法不同:

上一次:

字段名称 类型(大小) 空/非空 COMMENT'中文备注',
...
PRIMARY KEY(字段名称)

这种写法,把非空放在数据类型大小后,主键放在末尾。

我这次的写法,统统把约束置后:我们曾说NOT NULL约束,主键约束都是对字段的约束,我们索性就把约束全部放在后面。我觉得这对习惯编C,C++以及JAVA的同学较为友好。 

我们习惯 声明变量 采取这样的格式:

变量类型 变量名称;

MySQL的字段声明: 字段名称 类型(大小) 注释 + 约束

两项比较,只是把名称和类型调换了顺序;特殊的约束,我们把它压轴,以示尊重。

CREATE TABLE testdb.stu
(
   stuid CHAR(10) COMMENT'学号' PRIMARY KEY,
   stuname VARCHAR(40) COMMENT '姓名' NOT NULL,
   sex CHAR(1) COMMENT'性别',
   birthday DATE COMMENT'出生日期',
   #...
);

而没有约束的字段,我们直接忽略(方便哉)。

有细心的同学发现了一个特殊的约束:外键。这外键是什么,有什么作用,具体该如何写呢?

外键

外键约束,英文:FOREIGN KEY。

书上原话:FOREIGN KEY约束用于在两个数据表A和B之间建立连接,意义是“通过FOREIGN KEY约束可以保证两表间的参照完整性。”

示意图:

聊聊这张图:你能看出些什么?记住我们的目标是外键

有两张表,外键存在一张从表A里,主从关系从何而来?因为外键其实是引用表B的主键而来。常言道:“吃人嘴短,拿人手短”,表A外键的值是另一个表的主键,用了人家的主键,自己表里这个键是从外面来的约束自己字段的,此乃外键。

具体书写:

#秉承约束放最后的原则,外键有两行,需要指明引用哪个表的字段的主键
FOREIGN KEY(外键字段名) REFERENCES 主表(主键字段名)

现成的应用起来就是:

CREATE TABLE testdb.stu
(
   stuid CHAR(10) COMMENT'学号' PRIMARY KEY,
   stuname VARCHAR(40) COMMENT '姓名' NOT NULL,
   sex CHAR(1) COMMENT'性别',
   birthday DATE COMMENT'出生日期',
   #...不是一上来就FOREIGN KEY...原先字段名以及类型大小 中文注释该声明还得声明
   deptid CHAR(4) COMMENT'学院编号',
   FOREIGN KEY(deptid) REFERENCES dept(deptid)
);

外键的作用:

譬如这里,外键怎么约束自己的字段呢? 这是一张学生表,学院编号deptid外键是引用了学院表的deptid主键。

这也是昨天创建的第一张表。

学生表:有学号,姓名,性别,出生日期,学院编号。无非导入的是一条条学生的信息,在这张表里学生姓名可以重复,但是学号是绝不允许的。 学院表的主键:学院编号,保证了学院编号的唯一性。学生表里的学院编号之所以引用学院表的主键,是为了保证学院编号的正确性。

比如:我们要导入张三的信息,他的其他信息我们暂且忽略,他的学院是本来应该是魔法学院,编号为1,但是导入数据的人员,把“1”,打成了“10”。这时候外键起作用了,它是学院表的主键,它可以踢出非法的学院编号。

可以总结:外键,FOREIGN KEY约束可以保持数据一致性:通过外键约束,确保了从表(学生表)中的字段(学院编号)必须是已经存在于主表(学院表)中的有效值,从而避免了无效或错误的数据插入。

那么创建学生表的完整代码:

CREATE TABLE testdb.stu
(
   stuid CHAR(10) COMMENT'学号' PRIMARY KEY,
   stuname VARCHAR(40) COMMENT '姓名' NOT NULL,
   sex CHAR(1) COMMENT'性别',
   birthday DATE COMMENT'出生日期',
   
   deptid CHAR(4) COMMENT'学院编号',
   FOREIGN KEY(deptid) REFERENCES dept(deptid)
);

我们运行一下,成功是必然的。

记得,我们该怎么样查看表的字段信息吗? 诶没错,DESC + 表名

DESC testdb.stu;

(下午码字time)

左侧也有显示,我们创建出了两张表:

为了巩固我们创建表的基本功,接下来还有两张表。后续我们的添加,删除,查询和修改数据操作也都会基于这四张表。——(感觉跟写小说似的)

文末,我会放上这四张表和相应的创建代码,有需的同学自取(

再来两张表

看这两张,你如果已经达到心中有表,手上有代码的地步,恭喜,进度可以到3/4了。

照例分析一下:

表名course(表名一般没有首字母大写,倒是和JAVA,C++命名不是很像),有4个字段,主键约束属于cid,外键又是deptid学院编号。细节提醒,约束往后捎就是。

代码咱直接给了:

CREATE TABLE testdb.course
(
    cid CHAR(6) COMMENT'课程编号' PRIMARY KEY,
    cname VARCHAR(100) COMMENT'课程名称' NOT NULL,
    credit FLOAT COMMENT'学分' NOT NULL,
    deptid CHAR(4) COMMENT'学院编号',
    FOREIGN KEY(deptid) REFERENCES dept(deptid)
);

查看一下: 

下一张表:

这张表看起来很高冷啊,没有主键外键,非空约束。

我们直接写:

CREATE TABLE testdb.SC(
    stuid CHAR(10) COMMENT'学号',
    cid CHAR(6) COMMENT'课程编号',
    score INT COMMENT'成绩'
);
#有些同学偏不信鞋,我就是,非要写大写看看是不是那么回事

运行一下,刷新左侧:

看,是不是:存储的表名都是小写,首字母大写的待遇目前只看到Table有。

再看看表的结构信息:

参考代码 以及四张表:

#第一张表 dept
CREATE DATABASE testdb;
CREATE TABLE testdb.dept(
    deptid CHAR(4) COMMENT '学员编号' PRIMARY KEY,
    deptname VARCHAR(100)  COMMENT'学院名称'NOT NULL
);
DESC testdb.dept;
#第二张表 stu
CREATE TABLE testdb.stu
(
   stuid CHAR(10) COMMENT'学号' PRIMARY KEY,
   stuname VARCHAR(40) COMMENT '姓名' NOT NULL,
   sex CHAR(1) COMMENT'性别',
   birthday DATE COMMENT'出生日期',
   #...
   deptid CHAR(4) COMMENT'学院编号',
   FOREIGN KEY(deptid) REFERENCES dept(deptid)
);
DESC testdb.stu;
#第三张表 course
CREATE TABLE testdb.course
(
    cid CHAR(6) COMMENT'课程编号' PRIMARY KEY,
    cname VARCHAR(100) COMMENT'课程名称' NOT NULL,
    credit FLOAT COMMENT'学分' NOT NULL,
    deptid CHAR(4) COMMENT'学院编号',
    FOREIGN KEY(deptid) REFERENCES dept(deptid)
);
DESC testdb.course;
#第四张表 sc
CREATE TABLE testdb.SC(
    stuid CHAR(10) COMMENT'学号',
    cid CHAR(6) COMMENT'课程编号',
    score INT COMMENT'成绩'
);
DESC testdb.sc;

http://www.kler.cn/news/306651.html

相关文章:

  • 切换淘宝最新npm镜像源
  • Android应用性能优化
  • 抚琴成一快-音程和度数
  • 证券api接口,一个开源Python量化交易平台项目需要考虑哪些方面
  • [JVM]JVM内存划分, 类加载过程, 双亲委派模型,垃圾回收机制
  • 学习笔记JVM篇(一)
  • C语言中的信号量应用
  • 【ArcGIS Pro实操第七期】栅格数据合并、裁剪及统计:以全球不透水面积为例
  • Linux03
  • 使用 Nmap 进行 SSL/TLS 加密套件枚举
  • 什么是上拉,下拉?
  • STM32G070 CubeMX配置多通道/单通道ADC+DMA流程 LL库
  • Unity 粒子系统参数说明
  • cross-plateform 跨平台应用程序-09-phonegap/Apache Cordova 介绍
  • 0911(绘制事件,qt中的网络通信)
  • Introduction to LLMs in Python
  • 细说STM32单片机使用通用定时器生成固定占空比和可变占空比PWM波的方法
  • leetcode 230.二叉搜索树中第k小的元素
  • VMware Fusion虚拟机Mac版 安装Ubuntu操作系统教程
  • YOLOv8目标检测——迁移学习
  • 55页可编辑PPT | 集团制造企业数字化转型顶层设计方案
  • k8s中的认证授权
  • LeetCode双周赛139
  • 鸿蒙开发入门day19-使用NDK接口构建UI(一)
  • 中间件之RocketMQ
  • react js 使用 useEffect 钩子
  • C++函数在库中的地址
  • 【机器学习随笔】概率论与实际问题的对应
  • PHP技术深度探索:构建高效安全的Web应用实践
  • ChatGPT提示词-中文版(awesome-chatgpt-prompts中文版)