前面那篇文章是简单介绍了往数据库中插入数据,以及对数据进行有些改动。
但是,细想下,数据能够无限制,无约束进行插入吗?
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和class表中的id作为关联.
对class表插入三条数据
往学校表插入/更新数据时,classid列要在class存在才会显示插入成功
如若不在,报出以下错误:
意思是外键约束失败,要约束的id值在class表不存在.
值得注意的是,刚才的报错信息中一行 a child row
在这翻译为子表中的行。
class是约束的一方为父表,student为被约束的一方为子表。
那么删除呢?
是否能随意性的删除表中的值呢
很明显失败。
这是因为,父表中的某个记录被子表引用了,此时不能删除/修改父表中的对应记录/
就像是父表约束子表
子表也约束父表。
确保是先删除子表再删除父表
回到刚创建两个表来使用外键的时候,如若class不指定primary key,这样子可行不?
指定外键的时候,后续往子表插入数据,先在父表中查找,因为要保证查找的数据具有唯一性。
所以父表中的id列要给primary key。
讲到这,这里的一些约束算是分享完了。
那么接下来讲下表的设计吧。
表的设计:
表的设计是根据实际场景,梳理清楚,应该创建几个表?每个表都有几列,以及几个表之间都存在一些什么关系。
这是一个比较抽象的过程,同时依赖一定的设计经验。
而基本的切入点,就是:
梳理清楚需求中的“实体”和“关系”
而我们说的实体,可以理解为对象。
去找到一个个的对象,然后进一步的再去梳理出,这里的关键信息有什么。
而这个找对象,是如何操作的呢。
一般来说,就是分析你的需求场景,提取一些“关键的名词”
此外,还得需要确定对象的属性和方法,对象有哪些信息去保存,以及需要对这些信息如何进行加工操作。
等我们确定实体——>找出关键字名词,提出需要用到的信息,
所以,一般几个实体,对应到有几个表,但也是不绝对的。
梳理好实体间的关系,然后根据此关系,需要对表做出一些特殊的设定。
实体关系:
这里有些固定的套路,
比如
一对一的关系:
一个学生对应一个学生账号,
一个学生账号只能被一个学生拥有
比如:
students(studentId,name,accountName,password)
这是一个表做法
两个表
students(studentId,name,accountId)
account(accountId,accountname,password)
实际中,怎么方便怎么来。
一对多的关系:
一个学生属于一个班级,
一个班级有多个学生。
就像是这样。
多对多的关系
一个学生可以学习多门课程,
一门课程可以被多个学生持有
多对多的关系,可以以上图展示出来呢。
ok,那么就先分享到这里。