为了保证数据的完整性,防止数据库中存在不符合语义的数据存在,是表级的强制规定。

约束的分类

  • 根据约束数据列的限制,可分为:

    • 单列约束:每个约束只约束一列
    • 多列约束:每个约束可以约束多列数据
  • 根据约束的作用范围,可分为:
    • 列级约束:只能作用在一个列上,跟在列的定义后面。
    • 表级约束:可以作用在多个列上,不与列一起,而是单独定义。
  • 根据约束的作用,可分为:
    • NOT NULL 非空约束
    • UNIQUE 唯一性约束,可为null
    • PRIMARY KEY 主键约束,非空且唯一,且一个表只能有一个
    • FOREIGN KEY 外键约束
    • CHECK 检查约束
    • DEFAULT 默认值约束
    • AUTO_INCREAMENT 自增,一张表最多只能有一个

相关语法

查看某个表已有的约束

SELECT * FROM information_schema.table_constraints
WHERE table_name = '表名称';

添加约束

建表时
CREATE TABLE 表名称(
字段名 数据类型,
字段名 数据类型 NOT NULL,
CONSTRAINT uk_name unique(id)
);
建表后
alter table modify 字段名 数据类型 约束名;
alter table add unique key(字段列表);

删除约束

普通
alter table t1 modify 字段名 数据类型;  //相当于修改字段定义,不设置相关约束
删除唯一键约束

添加唯一性约束的列上会自动创建唯一索引,删除唯一键约束只能通过删除唯一索引。

alter table
drop index 索引名
删除主键约束
alter table t1 drop primary key;

外键

添加外键
create table  t1(
id int primary key,
dept_id int not null,
name varchar(50),
constraint fk_name foreign key(dept_id) references dept(id) on update cascade on delete set null
);

on update cascade on delete set null这部分是设置约束等级

外键约束的约束等级
  • Cascade方式 :在父表上update/delete记录时,同步update/delete掉子表的匹配记录

  • Set null方式 :在父表上update/delete记录时,将子表上匹配记录的列设为null,但是要注意子表的外键列不能为not null

  • No action方式 :如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作

  • Restrict方式 :同no action, 都是立即检查外键约束(默认)

  • Set default方式 (在可视化工具SQLyog中可能显示空白):父表有变更时,子表将外键列设置成一个默认的值,但Innodb不能识别

##### 删除外键约束

1、第一步先查看约束名和删除外键约束
SELECT * FROM information_schema.table_constraints WHERE table_name = '表名称';#查看某个表的约束名
alter table 从表名 drop foreign key 外键约束名;
2、查看索引名和删除索引
show index from 从表名;
alter table 从表名 drop index 索引名;

ps:

  • 外键约束不适合高并发
  • 外键约束不允许跨引擎存储

CHECK约束

mysql5.7有但是没用,mysql8.0有用

添加check约束
create table t1(
id int ,
name varchar(40),
sex varchar(1) check('男', '女'),
age int check(age > 0)
);

QA

为什么建表时,加 not null 、default ''或 default 0?

1.不好比较,null是一种特殊值,比较时只能用专门的is null 和 is not null来比较。碰到运算符,通常返回null。

2.效率不高影响索引效果。

MySQL8.0新特性自增变量的持久化

mysql8.0之前,自增主键AUTO_INCREMENT的值如果大于max(primary key)+1,在MySQL重启后,会重置AUTO_INCREMENT=max(primary key)+1,8.0之后不会。8.0之前对于自增主键的分配规则,是由InnoDB数据字典内部一个 计数器来决定的,而该计数器只在 内存中维护 ,并不会持久化到磁盘中。8.0之后这个计数器会持久化到重做日志中,mysql重启后会读取重做日志来初始化计数器的值。

Mysql基础篇(5)—— 约束相关推荐

  1. MySQL基础篇:子查询

    文章目录 概述 where型子查询 from型子查询 EXISTS型子查询 复制表子查询 概述 在某些情况下,当进行一个查询时,需要的条件或数据要用另一个select语句的结果,这个时候,就要用到** ...

  2. Mysql基础篇(1)—— 基础概念、DML基本语法和表连接

    前言 Mysql基础篇相关的内容是看了康师傅的视频做的笔记吧 数据库相关概念 DB: 数据库(Database) ​ 存储数据的仓库,本质是一个文件系统.它保存了一系列有组织的数据. DBMS:数据库 ...

  3. 最全MySQL基础篇

    文章目录 导入表的问题 第三章_最基本的SELECT语句 1. SQL语言的规则和规范 1) 基本规则 2) SQL大小写规范(建议遵守) 3) 注释 4) 命名规则 2. 基本的SELECT语句 1 ...

  4. 深入浅出Mysql - 基础篇(列类型/运算符/函数)

    深入浅出Mysql - 基础篇(列类型/运算符/函数) 每一个常量.变量和参数都有数据类型,它用来指定一定的存储格式.约束和有效范围.MySQL提供了多种数据类型,主要包括数值型.字符串类型.日期和时 ...

  5. MySQL基础篇——第11章 DML(数据操作):增删改

    MySQL基础篇--第11章 DML(数据操作):增删改 1. 插入数据(增) INSERT INTO ... 使用 INSERT INTO 语句向表中插入数据(记录) 1.1 方式1:VALUES ...

  6. MySQL——基础篇

    MySQL--基础篇 一.数据库的相关概念 数据库(database) 保存有组织的数据的容器(通常是一个文件或一组文件). 表(table) 某种特定类型数据的结构化清单. 模式(schema) 关 ...

  7. mysql 基础篇(二) 账号、权限管理

    mysql 基础篇(二) 账号.权限管理.备份与还原 建立账号密码: Grant all on test.* to "cj"@"localhost" ident ...

  8. 【MySQL基础篇】数据导出导入权限与local_infile参数

    [MySQL基础篇]数据导出导入权限与local_infile参数 问题背景 数据导出测试 创建测试库(在主库进行) 测试数据导出(在从库进行) 测试数据导入(在主库进行) 问题背景 MySQL高可用 ...

  9. MySql基础篇---003 SQL之DDL、DML、DCL使用篇:创建和管理表 ,数据处理之增删改,MySQL数据类型精讲 ,约束:联合主键

    第10章_创建和管理表 讲师:尚硅谷-宋红康(江湖人称:康师傅) 官网:http://www.atguigu.com 1. 基础知识 1.1 一条数据存储的过程 存储数据是处理数据的第一步.只有正确地 ...

  10. 22-05-10 西安 mysql基础篇(02) 修改表 、修改列、commit和rollback、表数据之增删改 DML 、列级约束、表级约束

    我们的情绪背后藏着动机,动机总是正面的,因为意识从来不会伤害自己,只是误以为某些行为可以满足自己的这份动机. 结果去重 distinct select distinct 字段列表 from 表名称 [ ...

最新文章

  1. 如何为WPF添加Main()函数
  2. 高危Windows 0day漏洞:看一眼就中毒
  3. Spring-AOP 通过配置文件实现 引介增强
  4. 函数matlab,Matlab函数
  5. 被替换的项目不是替换值长度的倍数_如果要在Excel中计算单元格内指定的字符长度,我推荐这两个公式.........
  6. Linux宏定义实现类成员函数,全面解析Linux内核的同步与互斥机制
  7. 正则表达式 6. 存在(或)
  8. java中怎么把两个JTextfield中的数字相加的值放到另一个JTextfield?_如何将jtextfield中的值解析为整数并对其执行一些数学操作?...
  9. NET中的三种Timer的区别和用法
  10. IDEA+Maven搭建JavaWeb项目
  11. 安卓udp发包工具_好装逼牌udp-tcp发包工具
  12. 我是如何考上武汉大学在职研究生的
  13. java 8 排序_java8——排序
  14. 无盘服务器吃鸡卡,网吧吃鸡卡-来看看你所在的网吧配置是否达标!
  15. VMware虚拟机无法识别U盘
  16. 模型推理时显存不足问题
  17. Windows解决运行slmgr.vbs -xpr 找不到应用程序问题
  18. ora-03114处理
  19. 路由器可以当交换机用吗
  20. java火车票预订系统代码_基于JSP开发火车票网上订票系统 java源码

热门文章

  1. 使用vuepress-reco主题创建博客
  2. 傻瓜式解决神舟系电脑rerun占用过高
  3. AR/AP - 借项通知单和贷项通知单的区别
  4. [课业] 25 | 数据库基础 | 基础SQL查询语言
  5. 运算放大器自激振荡仿真
  6. 学习笔记二:关于自激振荡
  7. Notes Twenty-third days-渗透攻击-红队-红队自研
  8. 安卓GB28181设备语音广播和语音对讲(Android GB28181 语音广播和语音对讲)实现
  9. Unity3d-简单AR游戏
  10. Texture tiling