mysql之mysql约束19

2023-10-26

概述:
本篇是我们DDL语言的最后一篇,从库和表的管理到本篇共3篇。
在这里插入图片描述

1 mysql约束

#常见约束

/*

1 含义:一种限制,用于限制表中的数据,为了保证表中的数据的准确和可靠性

2 分类:六大约束
	1)NOT NULL:非空,用于保证该字段的值不能为空
	比如姓名、学号等
	2)DEFAULT:默认,用于保证该字段有默认值
	比如性别
	3)PRIMARY KEY:主键,用于保证该字段的值具有唯一性,并且非空
	比如学号、员工编号等
	4)UNIQUE:唯一,用于保证该字段的值具有唯一性,可以为空
	比如座位号
	5)CHECK:检查约束【mysql中不支持】
	比如年龄、性别
	6)FOREIGN KEY:外键,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值
		在从表添加外键约束,用于引用主表中某列的值
	比如学生表的专业编号,员工表的部门编号,员工表的工种编号
	

3 添加约束的时机:
	1.创建表时
	2.修改表时
	
4 约束的添加分类:
	1)列级约束:
		六大约束语法上都支持,但外键约束没有效果	
	2)表级约束:
		除了非空、默认,其他的都支持
		
5 主键和唯一的大对比:
			保证唯一性  是否允许为空    一个表中可以有多少个主键或者唯一键   	是否允许组合
	主键	√			×				至多有1个主键          					√,但不推荐
	唯一	√			√				可以有多个唯一键        	 			√,但不推荐
	
	#测试1:利用通用的写法创建表后,测试唯一键在保持唯一性的情况下能否可以存在多个null-->可以
	INSERT INTO major VALUES(1,'java'),(2,'h5');#保证外键关联的列有数据	
	INSERT INTO stuinfo(id,stuname,sex,age,seat,majorid) VALUES(1,'j','男',19,null,1);#成功
	INSERT INTO stuinfo(id,stuname,sex,age,seat,majorid) VALUES(2,'l','男',19,null,2);#成功,证明唯一约束即seat可以有多个null
	INSERT INTO stuinfo(id,stuname,sex,age,seat,majorid) VALUES(null,'q','男',19,null,2);#错误,主键不能有null
	
	#测试2 :测试是否允许组合字段共同组成主键(唯一键同理)
	DROP TABLE stuinfo;
	CREATE TABLE stuinfo(
	id INT,
	stuname VARCHAR(20),
	gender CHAR(1),
	seat INT,
	age INT,
	majorid INT,
	CONSTRAINT pk PRIMARY KEY(id,stuname),#多个字段共同组成主键
	CONSTRAINT uq UNIQUE(seat),
	CONSTRAINT ck CHECK(gender ='男' OR gender  = '女'),
	CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id)
);
	INSERT INTO stuinfo(id,stuname,gender,seat,age,majorid) VALUES(1,'j','男',null,19,1);#成功
	INSERT INTO stuinfo(id,stuname,gender,seat,age,majorid) VALUES(2,'j','男',null,19,1);#成功
	INSERT INTO stuinfo(id,stuname,gender,seat,age,majorid) VALUES(1,'l','男',null,19,1);#成功
	INSERT INTO stuinfo(id,stuname,gender,seat,age,majorid) VALUES(1,'j','男',null,19,1);#失败,因为参1,2是主键,不能相同
	
6 外键:
	1、要求在从表设置外键关系。注意主表指被引用的外键列,从表指设置外键的表。例如这里主表为major,从表为stuinfo
	2、从表的外键列的类型和主表的关联列的类型要求一致或兼容,名称无要求
	3、主表的关联列必须是一个key(一般是主键或唯一,外键也行但无意义),否则无法创建该带外键的从表
	4、插入数据时,先插入主表,再插入从表
	删除数据时,先删除从表,再删除主表
	5、一个字段可以添加多个约束
	
7 创建带约束的表的语法:
	CREATE TABLE 表名(
	字段名 字段类型 列级约束,
	字段名 字段类型,
	表级约束
)	

*/


#一、创建表时添加约束
#1.添加列级约束
/*
语法:
直接在字段名和类型后面追加 约束类型即可。
只支持:默认、非空、主键、唯一
*/
#案例
CREATE DATABASE students;
USE students;
#DROP TABLE stuinfo;

CREATE TABLE major(
	id INT PRIMARY KEY,
	majorName VARCHAR(20)
);
CREATE TABLE stuinfo(
	id INT PRIMARY KEY,#主键
	stuName VARCHAR(20) NOT NULL UNIQUE,#非空
	gender CHAR(1) CHECK(gender='男' OR gender ='女'),#检查,但mysql不支持所以不会生效,为了尝试如何使用CHECK约束
	seat INT UNIQUE,#唯一
	age INT DEFAULT  18,#默认
	majorId INT REFERENCES major(id)#外键,但列级约束不支持
);
#查看stuinfo中的所有索引,包括主键、外键、唯一
SHOW INDEX FROM stuinfo;
#最好通过设计表查看上面的约束是否创建成功,CHECK,外键在列级约束都是不支持的,它们不在是正常的


#2.添加表级约束
/*

语法:在各个字段的最下面
 【constraint 约束名】 约束类型(字段名) 
*/
DROP TABLE IF EXISTS stuinfo;
CREATE TABLE stuinfo(
	id INT,
	stuname VARCHAR(20),
	gender CHAR(1),
	seat INT,
	age INT,
	majorid INT,
	
	CONSTRAINT pk PRIMARY KEY(id),#主键
	CONSTRAINT uq UNIQUE(seat),#唯一键
	CONSTRAINT ck CHECK(gender ='男' OR gender  = '女'),#检查,但mysql不支持所以不会生效,为了尝试如何使用CHECK约束
	CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id)#外键,在表级约束设置会生效
);
#查看stuinfo中的所有索引,包括主键、外键、唯一
SHOW INDEX FROM stuinfo;

#通用的写法:★
#DROP TABLE IF EXISTS stuinfo;#先删除表
CREATE TABLE IF NOT EXISTS stuinfo(
	id INT PRIMARY KEY,
	stuname VARCHAR(20),
	sex CHAR(1),
	age INT DEFAULT 18,
	seat INT UNIQUE,
	majorid INT,

	# 写在下面的约束代表表级约束,其中CONSTRAINT后面的fk_stuinfo_major代表约束的别名。
	# FOREIGN KEY代表外键,括号中majorid代表从表(谁设置外键谁就是从表)的外键由什么字段组成,可以多个,这里只有一个。
	# major(id)代表:引用主表major的字段id。该主表的id字段需要是一个键。可以看到上面的id是一个主键。
	# 这里整体意思是:在从表stuinfo创建一个外键约束着字段majorid,并且只有其组成外键,引用的是主表major的id主键。
	# 插入时:主表先插入;		删除时:从表先删除。
	# 这就是对外键的详细解释,实际是对上面的总结。
	CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id)
);
#查看stuinfo中的所有索引,包括主键、外键、唯一
SHOW INDEX FROM stuinfo;


#二、修改表时添加约束
/*
1、添加列级约束
alter table 表名 modify column 字段名 字段类型 新约束;

2、添加表级约束
alter table 表名 add 【constraint 约束名】 约束类型(字段名) 【外键的引用】;
*/
DROP TABLE IF EXISTS stuinfo;
CREATE TABLE stuinfo(
	id INT,
	stuname VARCHAR(20),
	gender CHAR(1),
	seat INT,
	age INT,
	majorid INT
);
DESC stuinfo;#可以查看是否为空,xxx键和默认值这些约束
#1.添加非空约束
ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20)  NOT NULL;

#2.添加默认约束
ALTER TABLE stuinfo MODIFY COLUMN age INT DEFAULT 18;

#3.添加主键
#①列级约束
ALTER TABLE stuinfo MODIFY COLUMN id INT PRIMARY KEY;
#②表级约束
ALTER TABLE stuinfo ADD PRIMARY KEY(id);

#4.添加唯一
#①列级约束
ALTER TABLE stuinfo MODIFY COLUMN seat INT UNIQUE;
#②表级约束
ALTER TABLE stuinfo ADD UNIQUE(seat);

#5.添加外键
ALTER TABLE stuinfo ADD CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id); 

#三、修改表时删除约束
#1.删除非空约束
ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NULL;

#2.删除默认约束
ALTER TABLE stuinfo MODIFY COLUMN age INT;

#3.删除主键
#ALTER TABLE stuinfo MODIFY COLUMN id INT;#注:这样写无法删除主键约束,最好使用drop
ALTER TABLE stuinfo DROP PRIMARY KEY;

#4.删除唯一
#ALTER TABLE stuinfo MODIFY COLUMN seat INT;#注:这样写无法删除唯一约束,最好使用drop
ALTER TABLE stuinfo DROP INDEX seat;

#5.删除外键
ALTER TABLE stuinfo DROP FOREIGN KEY fk_stuinfo_major;

SHOW INDEX FROM stuinfo;#用于查看唯一键,外键这些名字,例如seat,fk_stuinfo_major

2 mysql约束的案例

#1.向表emp2的id列中添加PRIMARY KEY约束(my_emp_id_pk)
ALTER TABLE emp2 MODIFY COLUMN id INT PRIMARY KEY;#列级添加法
ALTER TABLE emp2 ADD CONSTRAINT my_emp_id_pk PRIMARY KEY(id);#表级添加法,可以添加别名,但该别名实际没有作用

#2.	向表dept2的id列中添加PRIMARY KEY约束(my_dept_id_pk)
#同案例1

#3.	向表emp2中添加列dept_id,并在其中定义FOREIGN KEY约束,与之相关联的列是dept2表中的id列。
ALTER TABLE emp2 ADD COLUMN dept_id INT;
ALTER TABLE emp2 ADD CONSTRAINT fk_emp2_dept2 FOREIGN KEY(dept_id) REFERENCES dept2(id);

添加约束方法		位置			支持的约束类型					是否可以起约束名
列级约束:		列的后面		语法都支持,但外键没有效果			不可以
表级约束:		所有列的下面	默认和非空不支持,其他支持			可以(主键没有效果)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mysql之mysql约束19 的相关文章

  • 完全匹配where子句mysql中utf8中的单词

    我有一个这样的查询 SELECT FROM category keyword WHERE keyword cho 本次查询返回结果keyword cho ch ch ch 我只希望结果是 keywords cho 而不是 ch ch 我能怎
  • 设置并验证 Python MySQL 连接中使用的 SSL/TLS 版本

    如何告诉 Python MySQL 连接器使用哪种 SSL TLS 协议 特定的 例如 TLS1 2 或最低的 如何检查已建立的连接使用哪种协议 我有一个应用程序使用mysql connector python 8 0 18 我连接这样的东
  • 亚马逊 Linux 上的 mysql - MySQL 守护进程无法启动

    我尝试重新启动 EC2 实例并sudo service httpd restart 但我仍然收到这样的消息 ec2 user ip sudo service mysqld start MySQL Daemon failed to start
  • Excel VBA MySql 参数化更新“无效参数类型”

    我正在创建一个界面 用户可以在其中使用 Excel 无缝更改 SQL 数据库 我可以很好地检索数据 但是在更新记录时我得到 无效的参数类型 只需将值连接到查询中就可以正常工作 但是为了防止 SQL 注入 我需要参数化查询 我尝试用该值替换
  • 从 MySQL 中的字符串中删除引号和逗号

    我正在从一个导入一些数据CSV文件 以及大于的数字1000变成1 100 etc 有什么好方法可以从中删除引号和逗号 以便我可以将其放入int field Edit 数据实际上已经在 MySQL 表中 所以我需要能够使用 SQL 来完成此操
  • 当我的 MySQL 表更新时,如何收到电子邮件?

    您好 我想知道 MySQL 中是否有一种方法可以在 MySQL 表中添加一行时自动向自己发送电子邮件 实现这一目标的最佳方法是使用触发器和 cron 创建一个 通知队列 表 并在将行插入所需表时使用触发器填充该表 eg CREATE TAB
  • 如何计算 MySQL 查询返回的行数?

    如何计算 MySQL 查询返回的行数 获取查询结果中的总行数 您只需迭代结果并计算它们即可 你没有说明你正在使用什么语言或客户端库 但 API 确实提供了mysql num rows http dev mysql com doc refma
  • 使用 GROUP BY 时 MySQL SUM 不起作用

    假设我们有这张表 Symbol Size A 12 B 5 A 3 A 6 B 8 我们想要这样的视图 Symbol Size A 21 B 13 所以我们用这个 Select Symbol sum Size from table grou
  • PHP MySQLi 权限被拒绝,但可以从 MySQL CLI 运行

    我收到错误 Failed to connect to MySQL Permission denied 当从 PHP 与 MySQL MySQLi 和 PDO 连接到远程 MySQL 主机时 但是 如果我从同一主机在命令行上使用相同的凭据通过
  • 从 MySQL 数据库中选择随机问题; “正确答案”搞砸了

    我正在使用 PHP 和 MYSQL 构建一个简单的测验程序 测验旨在一次显示一个问题 问题为多项选择题 每个问题有 4 个可能的答案 如果玩家选择正确 他将进入下一个问题 如果他选错了 测验就会结束 首先 我设计的测验如下 1 创建一个数据
  • 如何通过给出月份和年份作为输入来获取mysql中该月的最后一天

    如何通过提供月份和年份作为输入来获取 MySQL 中该月的最后一天 Similar example To get last day of the month by date as input Eg SELECT LAST DAY as la
  • 在查询期间将时间戳转换为可读日期

    在 MySQL 客户端 控制台中输出查询结果之前 如何告诉 MySQL 将时间戳格式化为可读日期 Use FROM UNIXTIME http dev mysql com doc refman 5 1 en date and time fu
  • 获取“多个”列中每个不同值的计数

    所以可以说我有 id value 1 A 2 B 3 B 4 A 5 A 然后运行以下SQL语句 SELECT value COUNT AS num FROM test2 GROUP BY value 我会得到 A 3 和 B 2 很好 但
  • Java Collat​​or 与 MySQL 的 utf8_general_ci 排序规则具有相似的特性

    有没有Collator与MySQL的utf8 general ci具有相同特征的实现 我需要一个不区分大小写的整理器不区分德语元音变音如 与元音a 背景 我们最近遇到了一个错误 该错误是由表中的错误排序规则引起的 使用的排序规则是utf8
  • MySQL + Code First + 延迟加载问题!

    在一个非常简单的房地产程序中 我尝试使用 EF Code First 列出房屋的所有图像 附加到我拥有的现有数据库 我使用 MySQL Conector 6 3 6 这是我的代码 namespace CodeFirstMySQL class
  • 如何使用 Laravel + JavaScript 创建搜索过滤器?

    我最近创建了一个 JavaScript 过滤器来过滤产品表中的数据 我有 5 个字段可以输入搜索 它们是 描述 型号 经销商和库存 我将表与另一个视图中的产品分开 并将字段保留在索引中 我需要该表返回我在字段中输入的值 我举了一个用 描述
  • MariaDB 10 CentOS 7 移动数据目录的问题

    CentOS 7 和 MariaDB 10 的全新 最小 安装 我有一个额外安装的镜像卷 我想将其用于数据目录 当 my cnf mysqld 被注释掉时 启动顺序正常并正常完成 我已经复制了数据 sudo cp R p var lib m
  • 访问数据库的用户列表

    我有一个 MySQL 数据库 由我的一群队友访问 有没有命令可以获取当前正在访问或已经访问并注销的用户的日志信息 从 mysql 工具运行以下命令来查看所有当前正在运行的进程 包括睡眠连接 SHOW PROCESSLIST 或者 您可以查询
  • 如何通过sql查询在数据库中只保存时间而不保存日期

    此查询正在保存完整的日期和时间 但我只想在数据库中保存时间而不是日期 有什么查询可以做到这一点吗 update table set current time now 您的列必须设置为 DATETIME 或 TIMESTAMP 如果您使用 T
  • 优化缓慢的 ORDER BY RAND() 查询

    我有一个正在使用的查询ORDER BY RAND 但这需要太长时间 而且随着数据的增长 情况会变得更糟 该查询连接两个表 返回 5 个随机产品以及每个产品的随机图像 表 1 产品 product id pk auto inc name de

随机推荐

  • HDOJ 1827 - Summer Holiday 简单的tarjan求强联通分量+缩点

    题意 听说lcy帮大家预定了新马泰7日游 Wiskey真是高兴的夜不能寐啊 他想着得快点把这消息告诉大家 虽然他手上有所有人的联系方式 但是一个一个联系过去实在太耗时间和电话费了 他知道其他人也有一些别人的联系方式 这样他可以通知其他人 再
  • MMOCR之DBNET文字检测

    MMCV系列之MMOCR 注 大家觉得博客好的话 别忘了点赞收藏呀 本人每周都会更新关于人工智能和大数据相关的内容 内容多为原创 Python Java Scala SQL 代码 CV NLP 推荐系统等 Spark Flink Kafka
  • R语言入门(安装使用基础操作详细说明)合集

    R使用基础知识 Rstudio使用 R包管理 操作数据 空间数据处理 在jupyternotebook中使用R语言 参考博客 Rstudio使用 ctrl enter运行当前行代码 help中查找说明文档 查看前后绘图图片 工作目录设定及管
  • Android音视频任务列表之(一)——在 Android 平台绘制一张图片,使用至少 3 种不同的 API,ImageView,SurfaceView,自定义 View

    一 使用ImageView绘制图片 1 在布局文件中添加ImageView控件
  • 云原生环境 - Dockerfile挂载nfs盘【真实案例】

    文章目录 背景 解决 第1步 搭建NFS Server 第2步 调整Dockerfile 安装nfs utils 第3步 设置privileged权限 参考 背景 项目中使用RainBond 基于Kubernetes的云原生平台 部署相关微
  • 干货

    作者 李家丞 同济大学数学系本科在读 现格灵深瞳算法部实习生 近年来 深度学习模型逐渐取代传统机器视觉方法而成为目标检测领域的主流算法 本系列文章将回顾早期的经典工作 并对较新的趋势做一个全景式的介绍 帮助读者对这一领域建立基本的认识 营长
  • 数据库知识点总结(一)

    第一章 绪论 重点 掌握关系数据模型的相关概念 数据库系统三级模式和两层映像的体系结构 数据库系统的逻辑独立性和物理独立性等 难点 本章的难点是需要掌握数据库领域大量的基本概念 此 外 数据模型及数据库系统的体系结构也是本章的难点 1 1
  • 三个C语言中字符转换的函数

    wcstombs 将宽字符转换成多字符 mbstowcs 把多字符转换成宽字符 Setlocale 本函数用来配置地域的信息 设置当前程序使用的本地化信息 使中文路径生效的函数
  • 【RuoYi-Vue-Plus】学习笔记 08 - Mybatis Plus 分页插件实现分页功能

    文章目录 前言 参考目录 代码分析 1 分页构建使用 1 1 构建分页参数 2 分页插件 paginationInnerInterceptor 2 1 分页溢出处理 overflow 2 2 单页条数限制 maxLimit 前言 前段时间框
  • 阿里资深架构师答疑:数据湖概相关念、特征、架构与案例

    写在前面 最近 数据湖的概念非常热 许多前线的同学都在讨论数据湖应该怎么建 阿里云有没有成熟的数据湖解决方案 阿里云的数据湖解决方案到底有没有实际落地的案例 怎么理解数据湖 数据湖和大数据平台有什么不同 头部的云计算玩家都各自推出了什么样的
  • 华为OD机试 - 乱序整数序列两数之和绝对值最小(Java)

    题目描述 给定一个随机的整数 可能存在正整数和负整数 数组 nums 请你在该数组中找出两个数 其和的绝对值 nums x nums y 为最小值 并返回这个两个数 按从小到大返回 以及绝对值 每种输入只会对应一个答案 但是 数组中同一个元
  • 1.16 I/O文件的读、写操作(open方式打开文件)

    存在一个hello txt文件 内容如下截图 打开文件的语句是 file open file name access mode file name代表文件名 文件的全路径 access mode代表打开文件的模式 文件各个模式如下 一 文件
  • arm-linux-androideabi 和 arm-linux-gnueabi

    编译环境 ubuntu18 04 软件版本 全志SDK 安卓版本8 1 0 linux 4 9 0 问题描述 在全志的安卓系统中 需要运行C项目代码 在查找交叉编译工具时 shell里直接arm tab出来的是arm linux andro
  • sql查询每个学生的最高成绩mysql语句

    张三 语文 100 张三 数学 83 李四 语文 88 李四 数学 100 查询每个学生的最高成绩 select b from select name max score score from course GROUP BY name a
  • 微信小程序调用域名服务器的服务

    微信小程序得益于它的简单便捷 在日常生活中应用的很普遍 做过开发的同学都知道 微信的前端比较简单易懂 并且微信自带云开发 提供云存储 可以满足一些商家或者自媒体的需求 如果企业类的用户使用小程序 数据是存在企业自己的服务器上 小程序也提供了
  • echarts的展示区域地图,添加纹理图片

    echarts的展示区域地图 添加纹理图片 下面我们以广西南宁的来做实例 来进行这个渲染和添加纹理图片的操作 首先我们先看看文档 echarts 的geo的areaColor是可以支持通过图片来对地图的区域内容来进行纹理填充的 也可以进行颜
  • 操作系统笔记整理10——输入输出系统(2)

    点此链接可跳转到 操作系统笔记整理 目录索引页 参考书籍 计算机操作系统 第四版 汤小丹等编著 文章目录 点此链接可跳转到 操作系统笔记整理 目录索引页 用户层I O软件 系统调用 库函数 假脱机 Spooling 系统 SPOOLing的
  • vue同意本站协议的制作

    div p msg p h5 表单提交 h5 div
  • Echarts遇到Vue3时遇到的问题

    将vue2的Echarts代码迁移到了vue3项目上 引发的问题 问题描述 1 点击图例legend时刻度轴偏移 图像不展示 以及报错 初始chart正常 图 点击图例后的chart和报错 图 2 调用resize 不生效且报错 初始正常
  • mysql之mysql约束19

    概述 本篇是我们DDL语言的最后一篇 从库和表的管理到本篇共3篇 1 mysql约束 常见约束 1 含义 一种限制 用于限制表中的数据 为了保证表中的数据的准确和可靠性 2 分类 六大约束 1 NOT NULL 非空 用于保证该字段的值不能