前面那篇文章是简单介绍了往数据库中插入数据,以及对数据进行有些改动。

但是,细想下,数据能够无限制,无约束进行插入吗?

emm……显然是不行的,不然数据就乱套了,看起来不美观。

所以要对数据插入进行约束

既然讲到约束,那么来讲讲有些什么吧。

约束

约束类型有以下这些

NOT NULL:指示某列不能存储NULL值

UNIQUE:保证某列的每行必须有唯一的值。

DEFAULT:规定没有给列赋值时的默认值.

PRIMARY KEY:NOT NULL和UNIQUE的结合.确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录.

FOREIGN KEY:保证一个表中的数据匹配到另一个表中的值的参照完整性.

CHECK:保证列中的值符合指定的条件.对于MySQL数据库,对CHECK子句进行分析,但是忽略CHECK子句.

这里对外键进行简单的解释下,

比如,有一个商品表(商品id,商品名字,.........),和一个订单表(订单id,商品id,........).

这时候呢,使用外键后,订单表的商品id必须在商品表的订单id存在.

还有一个check约束也简单解释下

比如一个表中的name,这一行的具体条件为:name='男'or name='女'.

那么插入name的时候,就不能填入其他的,比如猴子什么的.

不幸运的是,MySQL中不支持这样的操作.

ok,那么接下来对这些约束进行一些例子的演示.

例子演示:

NOT NULL

UNIQUE

值得注意的是,为什么unique是如何知道数据重复的呢?

这是因为插入/修改之前,先要进行查询.

DEFAULT

最初的name那一列的默认值null,现在改为了无名.

PRIMARY KEY

这里是体现了主键的非空性

这里提示的报错信息是定义了多个主键,说明了一个表中,只能包含一个主键,体现主键的唯一性.

我们主键要对其字段分配一个唯一的值,那么它是如何分配的呢?

MySQL中提供了一个自动分配主键的方式,称为自增主键

即插入数据时,不指定某行的值,让数据库自动分配

自动添加id的值

这里有一点值得注意的是,如若我们这下手动指定id值,比如插入100,这下子,那么再插入吓一条的时候,它的值变成了101

这是因为,在MySQL中,每个表会记录一个自增主键的最大值,后续进行插入的时候,无论这个最大值的是否存在,都是会根据之前保存的最大值,继续往后分配.

FOREIGN KEY

这个外键涉及到了两个表

演示:

一个表是class

一个表是student

这里以创建学生表的时候,一classid和student表中的id作为关联.

对class表插入三条数据

往学校表插入/更新数据时,classid列要在class存在才会显示插入成功

如若不在,报出以下错误:

意思是外键约束失败,要约束的id值在class表不存在.

值得注意的是,刚才的报错信息中一行 a child row

在这翻译为子表中的行。

class是约束的一方为父表,student为被约束的一方为子表。

那么删除呢?

是否能随意性的删除表中的值呢

很明显失败。

这是因为,父表中的某个记录被子表引用了,此时不能删除/修改父表中的对应记录/

就像是父表约束子表

子表也约束父表。

确保是先删除子表再删除父表

当然,这是一种做法。

还有些做法,比如,如若是约束表中设置了级联删除,那么此时删除被约束表中的id,此时约束表中的id也会删除。

还可以先删除被约束表中的id,再去删除约束表中的id,这样也是可以的。

回到刚创建两个表来使用外键的时候,如若class不指定primary key,这样子可行不?

指定外键的时候,后续往子表插入数据,先在父表中查找,因为要保证查找的数据具有唯一性。

所以父表中的id列要给primary key。

讲到这,这里的一些约束算是分享完了。

那么接下来讲下表的设计吧。

表的设计:

表的设计是根据实际场景,梳理清楚,应该创建几个表?每个表都有几列,以及几个表之间都存在一些什么关系。

这是一个比较抽象的过程,同时依赖一定的设计经验。

而基本的切入点,就是:

梳理清楚需求中的“实体”和“关系”

而我们说的实体,可以理解为对象。

去找到一个个的对象,然后进一步的再去梳理出,这里的关键信息有什么。

而这个找对象,是如何操作的呢。

一般来说,就是分析你的需求场景,提取一些“关键的名词”

此外,还得需要确定对象的属性和方法,对象有哪些信息去保存,以及需要对这些信息如何进行加工操作。

等我们确定实体——>找出关键字名词,提出需要用到的信息,

所以,一般几个实体,对应到有几个表,但也是不绝对的。

梳理好实体间的关系,然后根据此关系,需要对表做出一些特殊的设定。

实体关系:

这里有些固定的套路,

比如

一对一的关系:

一个学生对应一个学生账号,

一个学生账号只能被一个学生拥有

比如:

students(studentId,name,accountName,password)

这是一个表做法

两个表

students(studentId,name,accountId)

account(accountId,accountname,password)

实际中,怎么方便怎么来。

一对多的关系:

一个学生属于一个班级,

一个班级有多个学生。

就像是这样。

多对多的关系

一个学生可以学习多门课程,

一门课程可以被多个学生持有

多对多的关系,可以以上图展示出来呢。

ok,那么就先分享到这里。

文章作者: 南汐
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 www.phblog.cloud
数据库 数据库
喜欢就支持一下吧