当前位置: 首页 > news >正文

约束:常见约束(常见约束-例子,外键约束)

目录

常见约束

常见约束-例子

外键约束

添加或删除外键

添加外键

删除外键

外键的删除/更新行为

外键的删除/更新行为有哪些

指定外键的删除/更新行为-语法

案例

CASCADE(级联)-例子

SET NULL-例子


常见约束

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

约束的作用:约束是用来保证数据库中数据的正确性,有效性,完整性和一致性。

常见的约束:

约束

描述

关键字

非空约束

限制该字段的数据不为NULL

NOT NULL

唯一约束

保证该字段的所有数据都是唯一的,不重复的

UNIQUE

主键约束

主键是一行数据的唯一标识,要求非空且唯一(一个表只能有一个主键字段)

PRIMARY KEY

默认约束

保存数据时,如果未指定该字段的值,则采用默认值

DEFAULT

检查约束(8.0.16版本之后支持)

保证字段值满足某一个条件或多个

CHECK

外键约束

用来让两张表的数据之间建立连接,保证数据的一致性和完整性

FOREIGN KEY

注意:

  1. 约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束
  2. 在MySQL中,注意CHECK要放到最后写
  3. 主键约束要想实现自增,可以加上AUTO_INCREMENT

常见约束-例子

需求:根据下表的要求,完成表结构的创建

用户表user

字段名

字段含义

字段类型

约束条件

id

id(唯一标识)

INT

主键,且自动增长

name

姓名

VARCHAR(10)

不为空,且唯一

age

年龄

INT

大于0,且小于等于120

status

状态

CHAR(1)

如果未指定值,则默认为1

gender

性别

CHAR(1)

注意:

  1. 自动增长的关键字:AUTO_INCREMENT,该字段是自增的,由数据库维护数据,不用插入数据
  2. 代码中,多个约束之间空格分开即可

代码:

CREATE TABLE USER(

    id INT PRIMARY KEY AUTO_INCREMENT COMMENT 'id主键',

    user_name VARCHAR(10) NOT NULL UNIQUE COMMENT '姓名',

    age INT COMMENT '年龄',

    user_status CHAR(1) DEFAULT '1' COMMENT '状态',

    gender CHAR(1) COMMENT '年龄',

    CHECK (age > 0 AND age < 120)

) COMMENT '用户表';

运行后,user表

在user表中插入数据

代码:

INSERT INTO user(user_name, age, user_status, gender)

VALUES('hyh', 23, '1', ''),

      ('hyh2', 43, '0', ''),

      ('hyh3', 21, '0', ''),

      ('hyh4', 18, '1', '');

运行后,user表中数据

注意:id是自增的

外键约束

外键约束:用来让两张表的数据之间建立连接,保证数据的一致性和完整性(通过外键约束来保证数据的一致性和完整性)

添加或删除外键
添加外键

建立外键关联语法-在建立表的时候添加:

CREATE TABLE 表名(

    字段名 数据类型,

    ...

    [CONSTRAINT] [外键名称] FOREIGN KEY(外键字段名) REFERENCES 主表(主表列名)

);

建立外键关联语法-有表,额外增加外键关联:

ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY(外键字段名) REFERENCES 主表(主表列名);

示例如下:

有两个表

emp员工表

dept部门表

建立两个表之间的外键关联,emp作为子表,dept作为父表(主表)

代码:

ALTER TABLE emp ADD CONSTRAINT fk_emp_dept_id FOREIGN KEY (dept_id) REFERENCES dept(id);

运行后,我们去删除dept表中的记录,发现不能随意去删除记录了...(因为有个emp表依赖于dept表)

删除外键

删除外键语法:

ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;

示例如下:

发现emp表中有外键fk_emp_dept_id

删除该外键

ALTER TABLE emp DROP FOREIGN KEY fk_emp_dept_id;

运行后,查看emp建表语句,发现外键已被删除;删除dept表中记录,发现也可成功删除

外键的删除/更新行为
外键的删除/更新行为有哪些

行为

说明

NO ACTION

当在父表(主表)中删除或更新对应记录时,首先应该检查该记录是否有对应的外键记录,如果有,则不允许删除/更新。(与RESTRICT一致)

注意:NO ACTION是外键约束的默认行为

RESTRICT

当在父表(主表)中删除或更新对应记录时,首先应该检查该记录是否有对应的外键记录,如果有,则不允许删除/更新。(与NO ACTION一致)

注意:RESTRICT是外键约束的默认行为

CASCADE

意思是:级联

当在父表(主表)中删除或更新对应记录时,首先应该检查该记录是否有对应的外键记录,如果有,则也删除/更新外键在子表中的记录。

SET NULL

当在父表(主表)中删除对应记录时,首先应该检查该记录是否有对应的外键记录,如果有,则设置子表中对应的外键记录的值为NULL(这就要求该外键允许取NULL)。

SET DEFAULT

当父表(主表)有表更时,子表将外键列设置为一个默认的值(MySQL的默认引擎Innodb不支持)

注意:

NO ACTION和RESTRICT是外键约束的默认行为

指定外键的删除/更新行为-语法

在建立外键约束的同时,指定外键的删除/更新行为:

ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段) REFERENCES 主表名(主表字段名) ON UPDATE 行为 ON DELETE 行为;

在HEIDISQL中更快捷方便的添加外键行为,如下:

案例

现有两张表,emp表和dept表

emp表数据如下:

dept表数据如下:

CASCADE(级联)-例子

需求:

  1. 在emp表和dept表之间建立外键约束,emp作为子表,dept作为主表(父表),emp表中的dept_id作为外键字段,对应主表dept中的id
  2. 指定外键约束的删除/更新行为,行为为级联:CASCADE

代码:

ALTER ALTER TABLE emp ADD CONSTRAINT fk_emp_dept_id FOREIGN KEY(dept_id) REFERENCES dept(id) ON UPDATE CASCADE ON DELETE CASCADE;

运行后,去更改dept表中的id,发现emp表中的dept_id会跟着更改;如果去删除dept表中的id记录,凡是emp表中有关联的dept_id的记录,一整条都会被删除

SET NULL-例子

需求:

  1. 在emp表和dept表之间建立外键约束,emp作为子表,dept作为主表(父表),emp表中的dept_id作为外键字段,对应主表dept中的id
  2. 指定外键约束的删除/更新行为,行为为:SET NULL

代码:

ALTER TABLE emp ADD CONSTRAINT fk_emp_dept_id FOREIGN KEY(dept_id) REFERENCES dept(id) ON UPDATE SET NULL ON DELETE SET NULL;

运行后,去删除dept表中的id记录,emp表中对应的外键dept_id的值为NULL

相关文章:

  • Transformers是一种基于自注意力机制的神经网络模型
  • ADVB的机载数字视频系统传输
  • AI 中的 CoT 是什么?一文详解思维链
  • 黑马点评redis改 part 3
  • Redis ④-通用命令
  • JavaWeb 课堂笔记 —— 15 MyBatis 基础操作
  • PG psql --single-transaction 参数功能
  • JavaScript 位掩码常量教程
  • Python range 使用详解
  • Oracle--用户管理
  • React 路由入门秘籍:BrowserRouter 的江湖之道
  • C++STL教程入门
  • python生成项目依赖文件requirements.txt
  • Rocky Linux 9.1 修改网卡和DNS
  • 操作系统中的虚拟化技术深度对话
  • 认知升级:把握人工智能教育化转型的历史机遇
  • trae海外版无限流白嫖指南,解决有限流,总提示在排队难题
  • 主机运行状态的监控命令(top命令)
  • React基础知识(补充中)
  • 19. git reflog
  • 最大涨幅9800%!金价新高不断,引发期权“末日轮”效应,沪金期权多张合约大涨
  • 中国与柬埔寨签署多领域合作文件
  • 大理杨徐邱上诉案开庭:当事人称曾接受过两次测谎测试
  • 专家学者视角下的乡村教育:目标与出路并非“走出大山”
  • 浙江一季度GDP为22300亿元,同比增长6.0%
  • 针对“二选一”,美团再次辟谣