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

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~

个人主页:.29.的博客

学习社区:进去逛一逛~

约束


⑦【MySQL】约束条件

1. 约束的基本使用

约束

  • 什么是约束?

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

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

    • 非空约束 ------ 限制该字段的数据不能为null

      sql 复制代码
      NOT NULL
    • 唯一约束 ------ 保证该字段的所有数据都是唯一、不重复的

      sql 复制代码
      UNIQUE
    • 主键约束------ 主键是一行数据的唯一标识,要求非空且唯一

      sql 复制代码
      PRIMARY KEY
    • 默认约束------ 保存数据时,未指定该字段的值,则采用默认值

      sql 复制代码
      DEFAULT
    • 检查约束(8.0.16版本之后)------ 保证字段满足某一条件

      sql 复制代码
      CHECK
    • 外键约束------ 用来让两证表的数据之间建立连接,保证数据的一致性和完整性

      sql 复制代码
      FOREIGN KEY
    • ⑦自增约束

      sql 复制代码
      AUTO_INCREMENT
sql 复制代码
-- 案例

/*
创建表
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. 外键约束

如何添加外键约束?

  • 方式一(在创建表时指定外键约束)

sql 复制代码
CREATE TABLE 表名(
	字段名 数据类型,
    ...
    [CONSTRAINT] [外键名称] FOREIGN KEY(外键字段名) REFERENCES 主表(主表字段名)
);
  • 方式二(在修改表时添加外键约束)

sql 复制代码
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY(外键字段名) REFERENCES 主表(主表字段名); 

外键的删除/更新行为

  • NO ACTION:在父表进行更新/删除时,首先检查记录是否存在外键,存在则不允许删除/更新。(与RESTRICT行为一致)

  • RESTRICT:在父表进行更新/删除时,首先检查记录是否存在外键,存在则不允许删除/更新。(与NO ACTION行为一致)

  • CASCADE:在父表进行更新/删除时,首先检查记录是否存在外键,存在则同时对外键关联的子表进行相应的更新/删除

  • SET NULL:在父表进行更新/删除时,首先检查记录是否存在外键,存在则将外键关联的字段值设置为null(前提是外键关联字段可以为null)

  • SET DEFAULT:在父表进行更新/删除时,首先检查记录是否存在外键,存在则将外键关联的字段值设置为一个默认值(Innodb不支持)

  • 添加外键约束时指定更新行为

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

相关推荐
s153352 分钟前
数据结构之顺序表,链表,栈,队列
数据结构·数据库
九分源码29 分钟前
基于PHP+MySQL组合开发开源问答网站平台源码系统 源码开源可二次开发 含完整的搭建指南
mysql·开源·php
程序员岳焱1 小时前
Java 与 MySQL 性能优化:MySQL分区表设计与性能优化全解析
后端·mysql·性能优化
天天摸鱼的java工程师1 小时前
MySQL表设计实战指南:从业务场景到表结构优化
java·后端·mysql
混乱意志2 小时前
dgraph example数据导入
数据库·后端
Web极客码2 小时前
WordPress 站点漏洞利用:数据库恶意注入与多重感染的案例分析
数据库·wordpress·网站安全·数据库注入·wordpress漏洞·wordpress安全插件
刺客xs2 小时前
MySQL数据库----DML语句
数据库·mysql
嘉讯科技HIS系统2 小时前
嘉讯科技:医疗信息化、数字化、智能化三者之间的关系和区别
大数据·数据库·人工智能·科技·智慧医疗
爱上语文3 小时前
Redis基础(4):Set类型和SortedSet类型
java·数据库·redis·后端
lifallen4 小时前
Paimon vs. HBase:全链路开销对比
java·大数据·数据结构·数据库·算法·flink·hbase