本文主要介绍了mysql数据库的几种常见的约束.
一.数据库约束
我们希望存储的数据是靠谱的,mysql提供一些机制来辅助我们自动的依赖程序对数据进行检查 .
这类查数据的机制,就是约束
一旦约束好了,后续在进行增 删 改的时候,mysql就会自动的对修改的数据做出检查,如果不符合约束就会直接报错 !
not null | 不是存储null值 . 跟在列名类型后面 |
unique | 唯一 . 保证某列的某行必须有唯一的值 |
default | 标识没有给值时候的默认值 |
primary key | 主键 , 非空 唯一 |
foreign key | 外键 |
-
not null
-
unique
指的是同一列不允许出现重复的值
设置id为unique,当插入两条id相同的数据,那么就会报错
-
default
如果未设置,使用默认值
-
primary key
主键约束
1.非空
2.不能重复
一个表只能有一个主键
自增主键
主键往往是一个整数类型的id,要求不能重复
允许客户端,在插入数据的时候,不手动指定主键的值,而是交给mysql自行分配,确保分配出来的这个主键的值,和之前的不重复
此时允许id设置为null,mysql会自动自增
mysql 服务器会维护id的最大值,每次从最大的id开始自增
如果mysql是一个单个节点的系统,基于上述策略,是没有问题的
如果mysql是一个分布式系统(有好几个主机,每个主机上都有mysql),此时自增主键就无法保证唯一性了
为了解决这个问题,市面上有一些分布式id的生成算法 ; 核心公式,目的就是为了保证系统上每个节点生成的id是唯一的 , 把id作为作为一个字符串,这个字符串由下列几个部分拼接成
1.主机编号/机房编号
2.时间戳
3.随机因子
生成的字符串格式的id就能够保证分布式系统下的唯一性了
分布式系统
由于一台主机的硬件资源是有限的 (cpu/内存/硬盘/网络带宽) ,增加主机就可以解决资源不足的问题.
-
foreign key
外键约束
父表:起约束的表
子表:受约束的表
1.插入或者修改子表中受约束的这一列的数据,就需要保证插入/修改后的数据在父表中是存在的. 如果是不存在的,就会报错
2.如果删除/修改父表中的记录,就需要看这个记录在子表中被使用了,如果被使用了,就不能进行删除/修改! ! !
索引
设置外键的时候,就会导致在进行的子表的时候,频繁的查询父表 ,这个操作是很耗时的,
为了加快查询速度,如果父表中的id这一列是带有索引,那就很好
primary key和unique这两个约束,都是有索引的
3.没有索引,就不能建立外键
-
check
写一个具体的表达式 , 符合当前的记录条件就可以进行插入/修改
对于mysql5来说,不支持check (写了也无效)