各位读者好, 我是小陈, 这是我的个人主页, 希望我的专栏能够帮助到你:
JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管理系统等
Java数据结构: 顺序表, 链表, 堆, 二叉树, 二叉搜索树, 哈希表等
JavaEE初阶: 多线程, 网络编程, TCP/IP协议, HTTP协议, Tomcat, Servlet, Linux, JVM等(正在持续更新)
提示:是正在努力进步的小菜鸟一只,如有大佬发现文章欠佳之处欢迎批评指点~ 废话不多说,直接上干货!
约束需要在创建表的时候给字段加上的, 也可以创建表后使用 alter 修改表结构, 本篇都使用第一种方式
设置了 unique 约束之后, 插入某个数据之前, 系统会先查询, 如果已经有了该数据, 则不能再插入
注意, 如果不手动设定默认值, 那么默认值为 NULL
primary key (主键约束)是一条数据的身份标识, 类似于通过身份证就能找到唯一的人, 通过快递单号就能找到唯一的包裹, 通过订单号就能找到唯一的订单
一张表只能有一个列为主键!!
和 unique 约束一样, 主键的字段插入数据之前, 系统会先进行查询
设置了主键之后, 插入什么数据还是取决于程序员如何编写 sql, 程序员也是有可能写错的, 当主键是数字时, MySQL 就贴心了提供了一个机制 : 自增主键(auto_increment)
设置了自增主键之后, 程序员不需要再手动指定主键的值, 插入数据对应字段不给值时, 使用最大值 +1。
foreign key (外键)用于关联其他表的主键或唯一键, 在多表查询中也至关重要
sql 语句 : foreign key (列名) references 其他表 (列名);
比如现在有一张学生表和班级表 :
创建班级表和学生表, 设置主键和外键 :
当外键关联了其他表中的主键, 就有了父表子表之分
从子表中插外键数据时, 会先从父表中的主键数据中查询是否存在该记录
在插入数据时, 父表约束子表, 要先插入父表中主键数据
在删除数据时, 子表约束父表, 要先删除子表中外键数据
这样的规则其实也比较合理, 如果在子表中还有外键约束的时候就把与之关联的父表中主键的数据删了, 子表中的这个外键就不能再使用了
但是这又引来了一个问题, 如果有时确实需要删除父表中的主键数据怎么办呢?
以电商网站为例, 商家至少要有一张商品表和一张订单信息表, 订单信息表中一定要有购买的商品的信息, 以方便顾客回购商品
如图 :
如果过了一段时间后, 顾客想回购这件商品, 但是这件商品下架了, 商品表的该商品的记录肯定是要删除, 但是订单表的该订单信息不能删除
现在的情况就是, 如何在不删除订单表(子表)中这条数据的前提下, 删除商品表(父表)中的这条数据?
根据外键的约束来看, 确实是没办法删, 而且外键约束也不能撤销, 正确的做法是, 给商品表多加一个"是否下架"的字段来表示该商品是否被删除, 这种做法称作"逻辑删除", 如果该商品的"是否下架"这个字段为"已下架", 则不在商品列表中显示即可
以上就是本篇的全部内容, 主要介绍了五种约束类型, 其中主键和外键最重要, 要重点理解他们的 sql 语法和使用时的注意事项
如果本篇对你有帮助,请点赞收藏支持一下,小手一抖就是对作者莫大的鼓励啦~
上山总比下山辛苦
下篇文章见