1、概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。
2、目的:保证数据库中数据的正确性、有效性、完整性。
3、分类:
(1)非空约束 not null 非空数据 常用于必要性信息数据
(2)唯一约束 unique 唯一数据,不可重复 常用于手机号、身份证号
(3)主键约束 primary key 唯一标识,非空且唯一 常用于 ID
(4)默认约束 default 设置默认值 常用于初始化数据
(5)检查约束 check 设置条件,mysql 8 新增特性 常用于年龄、分数、积分
(6)外键约束 foreign key 连接两张表,确保数据一致性、完整性 常用于银行、军事数据
4、常用约束示例:
(1)id primary && auto_increment
(2)name unique && not null
(3)age check && value > 0 && value < 120
(4)status default && default ' 1 '
5、外键约束
------------------------------------------优点------------------------------------------
(1)保证数据的完整性和一致性
(2)级联操作方便
(3)将数据完整性判断托付给了数据库完成,减少了程序的代码量
外键约束增强了数据的稳定性和准确性,适用于银行和军工行业,不允许丝毫的数据误差
------------------------------------------缺点------------------------------------------
(1)查询子表往往导致查询父表,衍生冗余查询,降低数据库性能
(2)为确保准确,子表操作可能会锁定父表数据,引发意外的锁等待,甚至导致死锁
(3)分库分表困难
(4)降低开发测试的效率
目前很多互联网公司,特别是大厂对于外键的态度都是要求一般禁用外键约束。这其实不单单因为性能问题,主要也因为互联网的业务变化快,会间接导致表结构容易发生变动,很可能会因为外键约束的存在导致导意想不到的问题和开发效率的降低。
作为补偿,会选择建立代码逻辑上的外键约束。增加代码开销,以换取开发质量。
# 1、新增子表唯一约束 ;
ALTER TABLE my_database.son_table ADD CONSTRAINT son_table_UN UNIQUE KEY (column);
# 2、新增父表外键约束
ALTER TABLE my_database.parent_table
ADD CONSTRAINT parent_table_FK FOREIGN KEY (column)
REFERENCES my_database.son_table(column)
ON DELETE RESTRICT ON UPDATE RESTRICT;
ALTER TABLE my_database.parent_table
ADD CONSTRAINT parent_table_FK FOREIGN KEY (column)
REFERENCES my_database.son_table(column)
ON DELETE SET NULL ON UPDATE SET NULL;
ALTER TABLE my_database.parent_table
ADD CONSTRAINT parent_table_FK FOREIGN KEY (column)
REFERENCES my_database.son_table(column)
ON DELETE CASCADE ON UPDATE CASCADE;
# 3、删除外键约束 ;
ALTER TABLE my_database.parent_table DROP FOREIGN KEY parent_table_FK;
# 4、删除子表唯一约束 ;
ALTER TABLE my_database.son_table DROP KEY son_table_UN;