约束
- 概念:约束是作用于表中字段上面的规则,用于限制表中的数据
- 目的:保证表中数据的正确性、完整性和有效性
- 分类:主要分为非空约束、唯一约束、默认约束、主键约束、外键约束和检查约束
非空约束
- 确保这个字段数据不能为空,为空的话无法插入数据
- 关键字:not null
- 示例:在“用户”表中,用户名(username)字段通常设置为非空,以确保每个用户都有一个唯一的标识符。
唯一约束
- 保证该字段中的所有数据都是不可重复的
- 关键字:unique
- 示例:在“用户”表中,邮箱地址(email)字段可以设置为唯一约束,以确保每个邮箱地址只对应一个用户。
主键约束
- 主键是一行数据中的唯一标识,具有非空和唯一性
- 关键字:primary key
- 示例:在“订单”表中,订单ID(order_id)字段通常设置为主键,以确保每个订单都有一个唯一的标识符。
默认约束
- 保存数据的时候,如果没有指定该字段的值的话,就按照这个默认约束的值来赋值
- 关键字:default
- 示例:在“用户”表中,性别(gender)字段可以设置为默认值为“男”,以在插入用户信息时未指定性别时自动填充为“男”。
检查约束
- 保证字段值满足某一个条件
- 关键字:check
- 示例:在“订单”表中,订单金额(order_amount)字段可以设置为检查约束,以确保订单金额大于0且小于某个最大值(如10000)
外键约束
- 外键约束的作用
- 确保数据的一致性和完整性。
- 维护表之间的引用关系。
- 关键字:foreign key
- 语法
- 在建表的时候直接添加:[constraint] [外键名称] foreign key(外键字段名)references 主表(主表列名)
- 在建好的表加上外键:alter table 表名 add constraint 外键名称 foreign key (外键字段名) references 主表(列名)
- 删除外键:alter table 表名 drop foreign key 外键名称
- 一般来说,建立的外键没有在指定外键行为的话,涉及到外键的数据就不能轻易删除,除非先删除外键,再剔除数据,相对来说安全但是麻烦
- 外键是删除和更新行为分为多种
- not action:当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。 (与 RESTRICT一致)
- restrict:当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。(与NO ACTION一致)
- cascade:当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有,则也删除/更新外键在子表中的记录。
- set null:当在父表中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null(这就要求该外键允许取null)。
- 一般来说是默认not action级别的,在删除的时候会报错,拒绝删除,当你想一起删除的时候可以设置为cascade,这个表示级联,一起删除主表和从表(父表和子表)中的数据,或者是将删除的数据设置为空,也是一种合理的方式,也就是set null级别的
- alter table 表名 add constraint 外键名称 foreign key (外键字段名) references 主表(列名)【on update cascade on delete cascade】;设置为cascade形式的
- alter table 表名 add constraint 外键名称 foreign key (外键字段名) references 主表(列名)【on update set null on delete set null】;设置为set null形式的
- 外键约束的局限性:如果系统不涉及分库分表,并发量不是很高的情况还是可以考虑使用外键的,但是涉及到的话就不建议使用了,下面是一些原因
- 在阿里巴巴开发手册上层明确表示对于这个开发的建议
- 增加了复杂性
- a. 每次做 DELETE 或者 UPDATE 都必须考虑外键约束,会导致开发的时候很痛苦, 测试数据极为不方便;
- b. 外键的主从关系是定的,假如那天需求有变化,数据库中的这个字段根本不需要和其他表有关联的话就会增加很多麻烦。
- 增加了额外工作
- 数据库需要增加维护外键的工作,比如当我们做一些涉及外键字段的增,删,更新操作之后,需要触发相关操作去检查,保证数据的的一致性和正确性,这样会不得不消耗数据库资源。如果在应用层面去维护的话,可以减小数据库压力;、
- 对分库分表不友好
- 因为分库分表下外键是无法生效的。
案例演示
- 其中的auto_increment是指自增的意思,就是这个主键会随着数据的增多而增大,不同软件的自增不太一样,这个只是MySQL中的自增表示