MySQL数据库操作拓展

这篇博客是对MySQL数据库操作的的一些拓展

目录

     一.数据库约束

     二.表的设计

一.数据库约束

数据库约束,关系型数据库的一个重要功能,需要保证数据的完整性,正确性。约束,就是让数据库帮助程序猿们更好的检查数据是否正确!约束给我们提供了一种校验数据合法性的机制。有如下关键字:

下面来详解一下每个关键字:

1.NOT NULL

创建一个学生表,在设置id时加上not null关键字,如图:

查看表的结构:

可以看到NULL这一列的id行被修改成NO,意思也就是在接下设置id的时候, 不允许为NULL。假如我们给一个空值就会报错,如图:

 由于name没有被设置成不允许为NULL,所以插入数据的时候name为NULL是可以的:

2.UNIQUE,PRIMARY KEY

 创建一个学生表,在设置id时加上unique关键字:

接下来展示表结构:

 表中KEY这一列会显示出UNIQUE的缩写UNI,代表插入的数据是唯一的。如果插入相同数据就会报错,如图:

因为存在相同的id,第二个数据在插入时会报错。数据库是如何判定当前这一条记录是重复的?

数据库先进行查找,再看可不可以插入。加上约束之后,数据库的执行过程可能就变了,很可能执行时间/效率就受到很大影响。但是代价再大,也比用手工检查一遍代价小很多,准确率高很多!

上述的约束,以及下面即将提及到的约束都是可以组合在一起使用的,一列可以同时加上多个约束,如图:

我们会发现,KEY这一列变成了PRI。PRI也就是primary key的缩写,代表主键约束,和not null+unique等价。所以主键也同样是在插入记录的时候,先查询,再插入!

3.DEFAULT

创建一个学生表,在设置名字的时候设置一个默认值,如图:

 此时我们使用desc关键字来查看表的结构:

 可以看到DEFAULT这一列的name行的默认值被修改成功。我们测试一下,当我们正常插入一个数据并且查看时:

 由于我们插入的数据我们是设置名字“张三”了的,显示“张三”是没问题的。接下来我们插入数据时不设置名字,也就是进行指定列插入并查看:

 由于这次插入我们没有设置名字,所以名字是我们设置的默认值“无名氏”。以上为DEFAULT的用法。

4.FOREIGN KEY

FOREIGN KEY:外键约束,是针对两个表之间产生的约束。我们创建一个班级表,一个学生表,如图:

 学生的班级classId要和班级类class中的id对应,此时是没问题的。我们再插入一个学生信息并展示:

student表中的classId 100在class表中是不存在的,就认为是非法的数据!为了让MySQL帮助我们自动完成这种类似的检查工作,就引入了外键约束。我们重新创建student表并引用外键约束:

我们会发现报错了,原因是因为,在使用外键约束时,两个表都必须存在主键约束,我们在第一个个表中并没有使用主键约束。所以在我们给第一个表加入主键约束之后,再设置第二个表的外键约束:

 此处外键约束的含义,就是要求student里的classId务必要在class表的id中存在。此时我们往student表中插入不匹配的数据的时候,MySQL就会报错:

 综上所述,学生表中的数据要依赖班级表的数据。班级表的数据就要对学生表的数据产生约束力(可以理解为父亲对孩子有约束力),此时起到约束作用的时班级表,又叫做父表,被约束的学生表,又叫做子表。表面上看。父表是对子表有约束,实际上,子表反过来也在约束父表!比如,我们尝试删除id为1的class中的记录时会发现删除失败:

 也就是说,当子表中有数据和父表约束上了,删除父表的数据也是不允许的。id为1,被子表给引用了,就删除不了,但是如果没有被引用,就可以删除。如果想顺利删除被约束的数据,应该先删除子表的数据,再删除父表的数据。

二.表的设计

表的设计对于初学者来说是比较抽象的,需要有一定经验之后才好理解。这里对表的设计进行一个简单的介绍。

对于表的设计,我们的基本思路是:

1.先明确实体。实体和我们在JAVA中谈到的“对象”是类似的,比如我们需要设计一个教务系统,教务系统中有学生信息,教师信息,课程表,作业信息等,这些都可以称为实体。

2.再明确实体之间的关系,关系其实有特定的套路:(1)没有任何关系(2)一对一的关系(3)一对多的关系(4)多对多的关系。

  .一对一的关系:就比如教务系统中学生对应的账号,一个学生只能有一个账号;一个账号也只能被一个学生用。针对这种关系,表的创建方法是:

1)把学生和账号两个实体放到同一个表里,比如:student_account(id,name,username,password);(此处省略了变量类型)

2)把学生和账号在不同的表里,相互关联,比如:

student(studentId,name);

account(accountId,username,password,studentId);

或者student(studentId,name,accountId);

account(accountId,username,password);

  一对多的关系:比如在教务系统里面的学生和班级之间的关系。一个学生只能存在于一个班级中,一个班级可以包含多个学生。针对这种关系,也有固定套路建表:

1)student(id,name);

     class(classId,name,studentIds);

通过studentIds这一列来存储学生的列表,要注意的是,这种方式在MySQL中是不可行的,因为MySQL中没有一个和数组类似的类型。但是在像redis这样的数据库中,则是支持“数组”这样的类型,就可以这样创建表。

一对多关系比较常见的是这样创建表:

student(id,name,classId);

class(classId,name);

   多对多的关系:比如教务系统中的学生和课程,一个学生可以修多门课程,一门课程也可以被多名学生来选择。针对这种关系,构造方法是:

student(studentId,name);

course(courseId,name);

student_course(studentId,courseId);ww

如果发现两个实体,在上述三个关系中都匹配不上,那就是无关系。

3.根据这些关系的使用的固定方法来建表,上面已经建好了。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晚报大街-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值