mysql约束

mysql约束

简介:

约束是作用于表中字段上的规则,用于限制存储在表中的数据。

目的:保证数据库中数据的正确、有效性和完整性。

分类:

注意:

约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束。

补充:mysql主键策略:

  • 主键自增
  • uuid做主键
  • 雪花算法做主键

自增的优点:

1.存储空间小

2.插入和查询性能高

自增的缺点:

1.int的范围可能不够大(但我觉得等数据到上亿级别,大部分情况下都要做分库分表了吧...)

2.当要做数据迁移的时候,会很麻烦,主键容易冲突

3.id自增,自身的业务增长情况很容易被别人掌握

4.自增在高并发的情况下性能不好

UUid的优点:

1.独一无二,几乎不会重复

2.数据合并很方便(主键不会冲突)

3.业务增长数据不会被轻易察觉

UUid的缺点:

1.生成UUid花的时间比较多

2.存储空间大

3.数据库存储UUid作为主键花的时间很多,消耗的性能也很多(因为数据库的B+数结构)

雪花算法:

是由符号位(1bit)+ 时间戳(41bit)+机器码(10bit)+序列号位(12bit) 一共64bit组成。

  • 符号位(1 bit):不使用,因为二进制中最高位是符号位,1表示负数,0表示整数,生成的ID一般都是正数,所以最高位固定为0;
  • 时间戳位(41 bit):用来记录时间戳,毫秒级。41位可以表示2 ^ {41}-1个数字,如果只用来表示正整数(计算机中正数包含0),可以表示的数值范围是:0至2 ^ {41}-1,减1是因为可表示的数值范围是从0开始算的,而不是1。也就是说41位可以表示2^{41}-1个毫秒的值,转化成单位年差不多是69年;
  • 工作进程位(10bit):工作机器ID,用来记录工作机器ID。可以部署 2 ^ {10} = 1024个节点,包括5位datacenterId和5位workerId。5位(bit)可以表示的最大正整数是2^{5}-1 = 31,即可以用0、1、2、3 ... 31这32个数字,来表示不同的datacenterId或workerId;
  • 序列号位(12bit):序列号,用来记录同毫秒内产生的不同ID。12位可以表示的最大正整数是2^{12}-1 = 4095,即可以用0、1、2、3 ... 4094 这4095个数字,来表示同一机器同一时间截(毫秒)内产生的4095个ID序号
    SnowFlake可以保证所有生成的ID按时间趋势递增,整个分布式系统内不会产生重复ID(因为有 datacenterId 和 workId来做区分)。
    所以他会有以下优点:
    1.不会重复
    2.有序,不会造成空间浪费和胡乱插入影响性能
    3.生成很快特别是比UUid快的多
    4.相比UUid更小

外键约束:

作用:用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性。

注意:外键链接的两张表,只是在逻辑上存在这样一层关系;在数据库层面,并未建立外键关联,所以是无法保证数据的一致性和完整性的

语法:

添加外键

sql 复制代码
CREATE TABLE 表名(
	字段名 数据类型,
	...
	[CONSTRAINT] [外键名称] FOREIGN KEY (外键字段名) REFERENCES 主表 (主表列名)
);
sql 复制代码
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名)
REFERENCES 主表 (主表列名) ;

删除外键

sql 复制代码
ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;

删除/更新行为

说明:添加了外键之后,再删除父表数据时产生的约束行为,我们就称为删除/更新行为。具体的删除/更新行为有以下几种:

语法:

sql 复制代码
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段) REFERENCES
主表名 (主表字段名) ON UPDATE CASCADE ON DELETE CASCADE;
相关推荐
霖霖总总9 小时前
[小技巧69]为什么总说MySQL单表“别超 2000 万行”?一篇讲透 InnoDB 存储极限
数据库·mysql
安科士andxe9 小时前
实操指南|安科士1.25G CWDM SFP光模块选型、部署与运维全攻略
运维·数据库·5g
Java爱好狂.10 小时前
RDB&AOF持久化原理解析
java·数据库·redis·后端开发·java编程·java程序员·java八股文
蓝胖子Lcl10 小时前
Mac安装Oracle数据库(M芯片)
数据库·macos·oracle
砚边数影10 小时前
从文档型数据库到企业级数据平台:一次架构演进的思考与实践
数据库·mongodb·架构·kingbase·数据库平替用金仓·金仓数据库
SQL必知必会10 小时前
SQL 删除重复行完全指南
数据库·sql
工业甲酰苯胺10 小时前
spring-事务管理
数据库·sql·spring
全栈前端老曹11 小时前
【Redis】Redis 持久化机制 RDB 与 AOF
前端·javascript·数据库·redis·缓存·node.js·全栈
李慕婉学姐11 小时前
Springboot平安超市商品管理系统6sytj3w6(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
Elastic 中国社区官方博客11 小时前
易捷问数(NewmindExAI)平台解决 ES 升级后 AI 助手与 Attack Discovery 不正常问题
大数据·运维·数据库·人工智能·elasticsearch·搜索引擎·ai