⑦【MySQL】什么是约束?如何使用约束条件?主键、自增、外键、非空....

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: ⑦【MySQL】什么是约束?如何使用约束条件?主键、自增、外键、非空....


⑦【MySQL】约束条件


1. 约束的基本使用

约束

  • 什么是约束?
  • 约束是作用于表中字段上的规则,用于限制存储在表中的数据。

  • 约束的作用:
  • 保证数据库中数据的正确性、有效性和完整性。

  • 约束分类:
  • 非空约束 —— 限制该字段的数据不能为null
NOT NULL

  • 唯一约束 —— 保证该字段的所有数据都是唯一、不重复的
UNIQUE

  • 主键约束—— 主键是一行数据的唯一标识,要求非空且唯一
PRIMARY KEY

  • 默认约束—— 保存数据时,未指定该字段的值,则采用默认值
DEFAULT

  • 检查约束(8.0.16版本之后)—— 保证字段满足某一条件
CHECK

  • 外键约束—— 用来让两证表的数据之间建立连接,保证数据的一致性和完整性
FOREIGN KEY

  • ⑦自增约束
AUTO_INCREMENT


-- 案例
/*
创建表
ID唯一标识:id、int、主键且自增
姓名:name、varchar(10)、不为空且唯一
年龄:age、int、大于0且小于等于120
状态:status、char(1)、默认值为1
性别:gender、char(1)、无约束条件
*/
CREATE TABLE test(
  id INT COMMENT 'id唯一标识' PRIMARY KEY AUTO_INCREMENT,
  NAME VARCHAR(10) COMMENT '姓名' UNIQUE NOT NULL,
  age INT COMMENT '年龄' CHECK(age BETWEEN 1 AND 120),
  STATUS CHAR(1) COMMENT '状态' DEFAULT 1,
  gender CHAR(1) COMMENT '性别'
);
-- 查看表结构
DESC test;
-- 向表中插入数据,自增字段可以不指定,会按123...n顺序自动填充
INSERT INTO test(NAME,age,STATUS,gender) VALUES
('小一',18,'1','男');
-- 当设置唯一约束的字段name插入不唯一数据时,会报错:
-- 错误代码: 1062 Duplicate entry '小一' for key 'test.name'
INSERT INTO test(NAME,age,STATUS,gender) VALUES
('小一',22,'1','女');
-- 当设置非空约束的字段name插入null值,会报错:
-- 错误代码: 1048 Column 'name' cannot be null
INSERT INTO test(NAME,age,STATUS,gender) VALUES
(NULL,22,'1','女');
-- 当设置了检查约束的age字段,插入不符合检查条件的数据,会报错:
-- 错误代码: 3819 Check constraint 'test_chk_1' is violated.
INSERT INTO test(NAME,age,STATUS,gender) VALUES
('小二',-1,'1','女');
-- 当插入数据时,没有为默认约束字段status设置值,会自动设置默认值1
INSERT INTO test(NAME,age,gender) VALUES
('小三',66,'女');




2. 外键约束

如何添加外键约束?

  • 方式一(在创建表时指定外键约束)
CREATE TABLE 表名(
  字段名 数据类型,
    ...
    [CONSTRAINT] [外键名称] FOREIGN KEY(外键字段名) REFERENCES 主表(主表字段名)
);

  • 方式二(在修改表时添加外键约束)
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY(外键字段名) REFERENCES 主表(主表字段名);


外键的删除/更新行为

  • NO ACTION:在父表进行更新/删除时,首先检查记录是否存在外键,存在则不允许删除/更新。(与RESTRICT行为一致)
  • RESTRICT:在父表进行更新/删除时,首先检查记录是否存在外键,存在则不允许删除/更新。(与NO ACTION行为一致)
  • CASCADE:在父表进行更新/删除时,首先检查记录是否存在外键,存在则同时对外键关联的子表进行相应的更新/删除
  • SET NULL:在父表进行更新/删除时,首先检查记录是否存在外键,存在则将外键关联的字段值设置为null(前提是外键关联字段可以为null)
  • SET DEFAULT:在父表进行更新/删除时,首先检查记录是否存在外键,存在则将外键关联的字段值设置为一个默认值(Innodb不支持)

  • 添加外键约束时指定更新行为
ALTER TABLE 表名 ADD 
CONSTRAINT 外键名称 
FOREIGN KEY(外键字段名) REFERENCES 主表(主表字段名)
ON UPDATE CASCADE ON DELETE CASCADE;
-- 将更新行为设定为:CASCADE、将删除行为设定为:CASCADE。
-- 指定何种更新/删除行为以实际为准,这里提供设定为CASCADE(方式二)的参考。
-- 除了在修改表时添加外键约束并设定更新/删除行为,还可以在新增表时(方式一)添加并设置。




相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
22小时前
|
NoSQL 关系型数据库 MySQL
2024Mysql And Redis基础与进阶操作系列(4-2)作者——LJS[含MySQL非空、唯一性、PRIMARY KEY、自增列/自增约束举例说明等详解步骤及常见报错问题对应的解决方法]
24MySQL非空、唯一性、PRIMARY KEY、自增列/自增约束举例说明等详解步骤及常见报错问题对应的解决方法(4-2) 学不会你来砍我!!!
|
2天前
|
SQL 关系型数据库 MySQL
mysql编写sql脚本:要求表没有主键,但是想查询没有相同值的时候才进行插入
mysql编写sql脚本:要求表没有主键,但是想查询没有相同值的时候才进行插入
6 0
|
26天前
|
Ubuntu 关系型数据库 MySQL
ubuntu使用aliyun源+mysql删除有外键约束的数据+查看特定目录的大小
ubuntu使用aliyun源+mysql删除有外键约束的数据+查看特定目录的大小
32 4
|
25天前
|
存储 SQL 关系型数据库
mysql中主键索引和联合索引的原理与区别
本文详细介绍了MySQL中的主键索引和联合索引原理及其区别。主键索引按主键值排序,叶节点仅存储数据区,而索引页则存储索引和指向数据域的指针。联合索引由多个字段组成,遵循最左前缀原则,可提高查询效率。文章还探讨了索引扫描原理、索引失效情况及设计原则,并对比了InnoDB与MyISAM存储引擎中聚簇索引和非聚簇索引的特点。对于优化MySQL性能具有参考价值。
|
2月前
|
存储 关系型数据库 MySQL
MySQL高级篇——覆盖索引、前缀索引、索引下推、SQL优化、主键设计
覆盖索引、前缀索引、索引下推、SQL优化、EXISTS 和 IN 的区分、建议COUNT(*)或COUNT(1)、建议SELECT(字段)而不是SELECT(*)、LIMIT 1 对优化的影响、多使用COMMIT、主键设计、自增主键的缺点、淘宝订单号的主键设计、MySQL 8.0改造UUID为有序
MySQL高级篇——覆盖索引、前缀索引、索引下推、SQL优化、主键设计
|
2月前
|
SQL 关系型数据库 MySQL
MySQL中外键的使用及外键约束策略
这篇文章讨论了MySQL中使用外键的重要性,包括外键的概念、不使用外键可能导致的问题、如何设置外键约束以及不同的外键约束策略(如CASCADE和SET NULL),并通过示例演示了这些概念。
MySQL中外键的使用及外键约束策略
|
2月前
|
关系型数据库 MySQL 测试技术
MySQL外键使用的考量与建议
综上所述,虽然MySQL的外键提供了一种强大的工具来维护数据之间的一致性和完整性,但在决定是否使用外键时,需要权衡其带来的好处和潜在的性能影响。通过仔细的规划和测试,可以最大化地利用外键的优势,同时避免一些常见的陷阱。
34 3
|
2月前
|
关系型数据库 MySQL 测试技术
MySQL外键使用的考量与建议
综上所述,虽然MySQL的外键提供了一种强大的工具来维护数据之间的一致性和完整性,但在决定是否使用外键时,需要权衡其带来的好处和潜在的性能影响。通过仔细的规划和测试,可以最大化地利用外键的优势,同时避免一些常见的陷阱。
97 1
|
26天前
|
SQL 关系型数据库 MySQL
MySQL设置表自增步长
MySQL设置表自增步长
43 0
|
16天前
|
存储 关系型数据库 MySQL
Mysql(4)—数据库索引
数据库索引是用于提高数据检索效率的数据结构,类似于书籍中的索引。它允许用户快速找到数据,而无需扫描整个表。MySQL中的索引可以显著提升查询速度,使数据库操作更加高效。索引的发展经历了从无索引、简单索引到B-树、哈希索引、位图索引、全文索引等多个阶段。
50 3
Mysql(4)—数据库索引