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~

相关推荐
萧曵 丶4 分钟前
Spring @TransactionalEventListener
java·数据库·spring·事务·transactional·异步
坤坤不爱吃鱼7 分钟前
【MySQL\Oracle\PostgreSQL】迁移到openGauss数据出现的问题解决方案
mysql·postgresql·oracle
胡斌附体8 分钟前
mobaxterm终端sqlplus乱码问题解决
数据库·乱码·sqlplus·字符集设置
moon66sun17 分钟前
开源项目XYZ.ESB:数据库到数据库(DB->DB)集成
数据库·esb
欧阳有财27 分钟前
[java八股文][Mysql面试篇]日志
java·mysql·面试
TDengine (老段)36 分钟前
使用 StatsD 向 TDengine 写入
java·大数据·数据库·时序数据库·iot·tdengine·涛思数据
DarkAthena42 分钟前
【GaussDB】深度解析:创建存储过程卡死且无法Kill会话的疑难排查
数据库·gaussdb
叁沐1 小时前
MySQL 03 事务隔离:为什么你改了我还看不见?
mysql
Gauss松鼠会1 小时前
GaussDB权限管理:从RBAC到精细化控制的企业级安全实践
大数据·数据库·安全·database·gaussdb
时序数据说1 小时前
时序数据库IoTDB用户自定义函数(UDF)使用指南
大数据·数据库·物联网·开源·时序数据库·iotdb