MySQL的约束

目录

MySQL表的约束

空属性NULL

默认值default

zerofill

[主键primary key](#主键primary key)

复合主键

自增长auto_increment

唯一键

外键与外键约束

综合案例


MySQL表的约束

基本概念:通过数据类型对字段进行约束比较单一,需要额外的约束从而确保数据的合法性

空属性NULL

*值:NULL(默认)***和NOT NULL

**基本概念:**数据库默认字段基本都是字段为空,但是实际开发时,要尽可能保证字段不为空,因为数据为空就无法参与运算

默认值default

值:default 值

基本概念: 某一种数据会经常性的出现某个具体的值,那么就可以在一开始就设定好,如果用户没有指定数据,就会使用该默认值

注意事项:INSERT INTO 语句中的字段数量和后面 VALUES 中提供的值的数量必须匹配

  • 没有默认值且字段不能为空时,必须要为字段插入数据
  • 没有默认值但字段能为空时,可以不为字段插入数据
  • 有默认值时,可以不为字段插入数据

zerofill

基本概念:用于设置数字的等宽,常用于设计统一样式的编号等场景,与int(数字)配合使用

主键primary key

基本概念:用于唯一标识表中每一行数据的字段或字段组合。主键确保了数据的唯一性和完整性,每个表只能有一个主键

特点:

  • 唯一性主键值必须唯一,不能重复
  • 非空性​主键值不能为空,不能为NULL
  • 单一性​一个表只能有一个主键
  • 索引功能MySQL 会自动为主键创建索引,以提高查询效率

为已存在的表中添加主键:alter table 表名 add primary key (字段名);

删除主键:alter table 表名 drop primary key;

复合主键

**语法:**primary key(字段名)

自增长auto_increment

基本概念:通常和主键 搭配使用,管理表中的唯一标识符,不需要每次都手动指定主键值,且可以自定义新的增长起始值

特点:

  • 任何一个字段要做自增长的前提是该字段本身是一个索引***(key一栏有值)***
  • 自增长字段的数据类型必须是整数
  • 一张表最多只能有一个自增长

使用last_insert_id()函数获取最后插入记录的自增长值:

自定义新的自增起始值:alter table 表名 auto_increment = 数字;

唯一键

基本概念:一个表中只能有一个主键但可以有多个唯一键,用于增强约束力,唯一键保证列中的值是唯一的,但是可以为 NULL。不同于主键,唯一键允许 NULL 值,并且每个 NULL 值在字段中是允许重复的(主键保证表中我们设定的每一行的编号id都是唯一的,唯一键保证每一列中所有的数据都是唯一的)**

外键与外键约束

基本概念: 一种用于 维护表之间关系 的约束。它定义了一个表中的字段(或字段组合)作为另一个表的 主键 或 唯一键 的引用,用于实现表与表之间的关联关系。外键的作用是确保数据的 完整性 和 一致性,通过约束保证数据库中不同表之间的数据关系正确,不会出现无效或不一致的数据

语法:foreign key (子表的字段名) references 主表(要与子表字段名建立联系的字段名)

  • 父表和子表:谁建立的外键谁就是子表
  • 外键字段: 子表中指向父表主键或唯一键的字段
  • 引用关系: 子表的外键字段值必须与父表的主键或唯一键值一致,或者为 NULL

注意事项:在定义外键约束时,主表和子表的字段的数据类型必须完全一致,包括是否使用 unsigned属性

综合案例

有一个商店的数据,记录客户及购物情况,由以下三个表组成:

  • 商品goods(商品编号goods_id,商品名goods_name,单价unitprice,商品类别category,供应商provider)
  • 客户customer(客户号customer_id,姓名name,住址address,邮箱email,性别sex,身份证card_id)
  • 购买purchase(购买订单号order_id,客户号customer_id,商品号goods_id,购买数量nums)

~over~

相关推荐
陈卓4103 分钟前
Redis-缓存穿透&击穿&雪崩
数据库·redis·缓存
泡泡Java9 分钟前
Redis离线安装(内网,源码安装)
数据库·redis·缓存
想做富婆23 分钟前
存储过程和自定义函数在银行信贷业务中的应用(oracle)
数据库·存储过程·银行贷款业务
珹洺27 分钟前
数据库系统概论(三)数据库系统的三级模式结构
java·运维·服务器·数据库·oracle
不知真不只28 分钟前
数据库---sqlite3
数据库
Huooya42 分钟前
Spring的基础事务注解@Transactional
数据库·spring·面试
程序员麻辣烫1 小时前
晋升系列4:学习方法
java·数据库·程序人生·学习方法
程序员buddha1 小时前
ThinkPHP8.0+MySQL8.0搭建简单实用电子证书查询系统
javascript·css·mysql·php·layui·jquery·html5
颜淡慕潇1 小时前
【面试题系列】 Redis 核心面试题(二)&答案
数据库·redis·缓存
我真的不会C2 小时前
Mysql表的复合查询
java·数据库·mysql