MySQL表的增删改查(进阶)-上篇
目录
数据库约束
约束类型
NULL约束-非空约束
UNIQUE-唯一约束
DEFAULT-默认值约束
PRIMARY KEY-主键约束
FOREIGN KEY-外键约束
CHECK约束(了解)
表的设计
实体间的关系
数据库约束
数据库中的数据是如此重要,希望数据库里的数据,不要存在一些"错误的"数据。
数据库中的"约束'',对于数据库存储的数据,做出一些"限制”"要求”。
负责插入数据的程序员,确保插入的数据是靠谱的,人是不靠谱的,机器靠谱!程序靠谱!
约束,就是数据库这样的程序,对于保存的数据,进行合法性检查,这样的机制,一旦发现问题,数据库程序就能及时给出反馈。
约束类型
NOT NULL - 指示某列不能存储NULL值。
UNIQUE - 保证某列的每行必须有唯一的值。
DEFAULT - 规定没有给列赋值时的默认值。
PRIMARY KEY - NOT NULL和UNIQUE的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。
FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性。
CHECK - 保证列中的值符合指定的条件。对于MySQL数据库,对CHECK子句进行分析,但是忽略CHECK子句。MySQL并不支持,但是写了CHECK不会报错,检查条件不会生效!
NULL约束-非空约束
UNIQUE-唯一约束
unique是如何知道数据存在重复的呢?插入/修改之前,先进行查询
DEFAULT-默认值约束
最初的默认值都是NULL
PRIMARY KEY-主键约束
约定了这个表里某个列为"身份标识"(非空且唯一)
不允许一个表中同时存在多个主键(多个身份标识)
主键需要分配一个唯一的值,如何进行分配呢?MySQL提供了一个自动分配主键值式,"自增主键"。插入数据时,可以不指定id列的值,让数据库自动分配,就会按照1,2,3,4…
也能手动指定其他数值
接下来插入的时候,自动分配下一条记录是5?还是101?
在MySQL中,给每个表都记录了一个"自增主键的最大值'',后续继续插入数据,无论之前的最大值是否仍然存在,都是根据之前保存的最大值继续往后分配的。
自增主键只能针对,像int/bigint整数,大部分情况下,都是用数字作为主键也是有可能会使用字符串作为主键的,可能数据量特别大的时候,不是一个MySQL数据库而是多个MySQL构成的分布式"集群'',像大公司,每天处理的数据量很大,一台机器是无法存储完成的,即使我们用的机器,配置很高,可以加很多个硬盘,此时就可以引入多个机器了,每个机器上只存储一部分数据应用程序,插入数据的时候,有一个计算规则,对数据进行区分,看这个数据是存储在哪个机器上,虽然在多个数据服务器上存储数据,仍然希望,这些数据的id这一列,仍然是唯一的,此时MySQL自增主键就难以胜任了(只能在一个机器上的MySQL生效,不能跨主机),此时,就会把id指定成字符串类型,然后通过应用程序里面的一系列算法,生成一个"唯一''的字符串id(生成的时候,有很多种不同的方式,比如uuid/雪花算法.…)
FOREIGN KEY-外键约束
涉及到两个表
没有指定约束之前
指定约束之后
往student插入的时候会触发针对class表的查询.
如果父表中的某个记录,被子表引用了,此时就不能删除/修改父表中的对应记录了
父表是约束了子表,子表也会对父表反向进行约束…删表的时候还需要确保先删除子表再删除父表
再创建表
为什么加不了主键了
指定外键的时候,后续往子表中插入数据,就需要查询父表
主键本身也是有"唯一性要求的”,频繁触发查询,此处数据库就会对主键约束,给出特殊的处理(数据库会针对主键列创建索引),加快查询速度如果不指定主键,是一个unique,也能达成类似的效果,都是要自动建立索引,以便于后续的快速查询
CHECK约束(了解)
MySQL使用时不报错,但忽略该约束:
drop table if exists test_user;
create table test_user (
id int,
name varchar(20),
sex varchar(1),check (sex ='男' or sex='女')
);
表的设计
如何创建表,根据实际需求场景,梳理清楚,应该创建几个表,每个表都要有哪些列,以及多个表之间存在啥样的联系。
涉及到一些实际需求:
需要管理好同学(身份信息)和对应的成绩信息…
能够要提取出关键的内容
确定实体=>找到关键名词,提取出一些需要用到的信息…
有几个实体,一般就会有几个表,每个实体使用一个表来表示(也不绝对)
梳理实体之间的关系,根据这里关系需要对于表做出一些特殊的设定,
实体间的关系
三大范式:
(1)一对一
(2)一堆多
(3)多对多