初写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;