MySQL表的约束

2023-11-06


继续使用上篇文章https://blog.csdn.net/z714405489/article/details/90524663#_446中的例子,也就是两个存在一定关系的表:分类表与商品表。

表1:商品分类

create table category(
	cid int primary key auto_increment,
	cname varchar(10),
	cdesc varchar(31)
);
insert into category values (null,'手机数码','电子产品,猪猪生产');
insert into category values (null,'鞋靴箱包','江南皮革厂生产');
insert into category values (null,'香烟酒水','茅台二锅头');
insert into category values (null,'酸奶饼干','蒙牛生产');
insert into category values (null,'馋嘴零食','花生瓜子八宝粥+辣条');

表2:商品

create table product(
	pid int primary key auto_increment,
	pname varchar(10),
	price double,
	pdate timestamp not null default CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
	cno int
);
insert into product (pid,pname,price,cno)values(null,'华为p30',4999,1);
insert into product (pid,pname,price,cno)values(null,'红米note4',1999,1);
insert into product (pid,pname,price,cno)values(null,'耐克',499,2);
insert into product (pid,pname,price,cno)values(null,'老村长',88,3);
insert into product (pid,pname,price,cno)values(null,'劲酒',35,3);
insert into product (pid,pname,price,cno)values(null,'小熊饼干',4,4);
insert into product (pid,pname,price,cno)values(null,'卫龙辣条',2,5);
insert into product (pid,pname,price,cno)values(null,'旺旺雪饼',3,5);

在这里插入图片描述

现在往商品表中继续插入数据:

insert into product (pid,pname,price,cno)values(null,'德芙巧克力',10,12);

由于cno为12在分类表中的cid并不存在这个编号,所以这条数据虽然能插入成功,但却是没有意义的,因为我们假定这两个表之间是存在约束关系的。

约束

概念

对表中的数据进行限定,保证数据的正确性、有效性和完整性。

分类

  • 非空约束:not null
  • 唯一约束:unique
  • 主键约束:primary key
  • 外键约束:foreign key

非空约束:not null

顾名思义,意味着数据的值不能为null
添加约束的方式有三种:

  • 创建表时添加约束
		CREATE TABLE stu(
			id INT,
			NAME VARCHAR(20) NOT NULL -- name为非空
		);
  • 创建表完后,添加非空约束
ALTER TABLE stu MODIFY NAME VARCHAR(20) NOT NULL;
  • 删除非空约束
ALTER TABLE stu MODIFY NAME VARCHAR(20);

唯一约束:unique

意味着被修饰的列,值不能重复。

  • 添加唯一约束:
CREATE TABLE stu(
			id INT,
			phone_number VARCHAR(20) UNIQUE -- 添加了唯一约束
		
		);

或在创建表后添加:

ALTER TABLE stu MODIFY phone_number VARCHAR(20) UNIQUE;
  • 删除唯一约束
ALTER TABLE stu DROP INDEX phone_number;
  • 唯一约束限定的列的值可以有多个null
  • 唯一约束不可以作为其它表的外键
  • 可以有多个唯一约束

主键约束:primary key

含义:非空且唯一。

  • 外键都是指向另外一张表的主键
  • 主键一张表只能有一个,是表中记录的唯一标识

添加:

create table stu(
			id int primary key,-- 给id添加主键约束
			name varchar(20)
		);

或建表之后添加主键:

ALTER TABLE stu MODIFY id INT PRIMARY KEY;

删除:

ALTER TABLE stu DROP PRIMARY KEY;

自动增长:

  • 概念:如果某一列是数值类型的,使用 auto_increment 可以使该列的值实现自动增长。
  • 实现:
create table stu(
			id int primary key auto_increment,-- 给id添加主键约束
			name varchar(20)
		);
  • 删除:
ALTER TABLE stu MODIFY id INT;
  • 修改:
ALTER TABLE stu MODIFY id INT AUTO_INCREMENT;

外键约束:foreign key

让表与表产生关系,从而保证数据的正确性。A表的主键,在B表中字段出现,就是外键
外键是用来实现参照完整性的,不同的外键约束方式将可以使两张表紧密的结合起来,特别是修改或者删除的级联操作将使得日常的维护工作更加轻松。
语法

  • 创建表时,可以添加外键
create table 表名(
				....
				外键列
				constraint 外键名称 foreign key (外键列名称) references 主表名称(主表列名称)
			);

还有另一种就是创建完表后再添加外键——

alter table 表名 add foreign key  (外键字段名称) references 主表名称(主表列名称);
  • 删除外键
ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;
  • 级联操作
    含义是若有两个或以上表之间存在关联,当一个表发生改变时,希望关联的表可以跟着进行改变。(使用需谨慎)
    1. 添加级联操作
    语法:
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 
					FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称) ON UPDATE CASCADE ON DELETE CASCADE  ;
  1. 分类:
  • 级联更新:ON UPDATE CASCADE
  • 级联删除:ON DELETE CASCADE

外键约束案例:
在本例中,给product中的cno添加一个外键约束,指向的是category中的cid:

alter table product add foreign key(cno) references category(cid);

那么,cno就是product的一个外键。
在这里插入图片描述
如果在添加约束前插入下面的数据,添加约束将会报错,因为数据不符合即将建立的约束。
同理,当添加约束后再插入此数据,将会插入失败。

insert into product (pid,pname,price,cno)values(null,'德芙巧克力',10,12);

在这里插入图片描述
建立约束后,若想从category表中删除分类为5的信息,将会失败:在这里插入图片描述

若想成功删除,需要先把product表中所有cid为5的数据删除。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL表的约束 的相关文章

  • 我不小心锁定了 MySQL 的 root

    我在 OS X 上使用 MySQL 并使用删除了所有 root 用户DROP USER 然后我又添加了其中一些并做了GRANT ALL on to root localhost 然后在验证确实是的之后注销 我可以登录并执行一些特权操作 不幸
  • PDO 和 Microsoft SQL:必须声明表变量“@P1”

    我正在尝试使用 PDO 中的绑定从 Microsoft SQL 数据库中选择一些条目 我正在使用的代码看起来与我在文档中找到的代码类似 但是 当我运行它时 我收到以下警告 警告 PDOStatement execute pdostateme
  • 重新排列mysql中的主键

    从MySQL表中删除一些行后如何重新排列主键列值 例如 一个包含 4 行数据的表 主键值为 1 2 3 4 当删除第2行和第3行时 第4行的键值变为2 请帮助我找到解决方案 为什么要这样做 你不需要重新排列您的密钥 因为它只是记录的数字和标
  • 为什么这个 MySQL 更新不起作用?

    有一张桌子叫meterreadings 我需要复制属性meterreading从一排到另一排 这是数据示例 id meterreadingdate meterreading meterreadingtype id created 1 201
  • MySQL 命令输出在命令行客户端中太宽[重复]

    这个问题在这里已经有答案了 我在用mysql终端模拟器中的命令行客户端lxterminal在Ubuntu中 当我运行以下命令时 mysql gt select from routines where routine name simplep
  • SQL Server到Mysql迁移(使用Mysql Workbench)数据传输错误

    我正在使用 Mysql Work bench 6 3 将数据库从 MS Sql server 2008 迁移到 Mysql 在 批量数据传输 期间出错并出现以下警告 这种情况仅发生在像 varchar char 这样的列类型上 当我尝试使用
  • 如何使用 pgAdmin 恢复 postgreSQL 转储文件?

    我有一个 dmp 文件 想要从中恢复数据库 使用 pgAdmin 我该怎么做 在 PgAdmin3 内 在您正在使用的服务器中创建一个新数据库 右键单击该数据库并选择 恢复 使用 浏览器 按钮选择 dmp 文件 选择 恢复 开始恢复数据库
  • 如何使用Conda安装MySQLdb?

    我已经阅读了有关如何安装 MySQLdb 的几种不同的解释 但我不确定哪种情况适用于我 因为我的错误消息不同 我的系统似乎找不到 MySQLdb 我安装了 pymysql 但我需要导入 MySQLdb 才能使用该库中的过程 感谢您的帮助 c
  • 工厂模式数据库连接

    我正在尝试使用 MySQL 实现数据库连接上的工厂模式 SQL Server 面临奇怪的错误 你调用的对象是空的 在 SQL 命令对象上 internal class SqlServerDB IDatabase private SqlCon
  • PHP/MySQL:检索邻接列表模型中的单个路径

    有没有什么有效的方法可以在不限制深度的情况下根据节点的ID检索邻接列表模型中的单个路径 就像如果我有一个名为 Banana 的节点的 ID 我可以获得以下路径 Food gt Fruits gt Banana 如果不可能的话也不是什么大问题
  • 使用 JOIN 和 UNION 合并不同表中的记录

    我需要创建一个查询来组合两个表中的数据 我认为可能是 JOIN 和 UNION 的组合 在此示例中 我需要列出状态处于活动状态的所有姓名 仅一次 并将他们的葡萄酒 苏打水 晚餐 甜点和水果偏好组合起来 按姓名排序 我不确定单独的 JOIN
  • 如何编辑表以启用级联删除?

    我有一个代表用户的表 当用户被删除时我得到 DELETE 语句与 REFERENCE 约束冲突 显然 CASCADE DELETE在SQL Server中并不像我想象的那么容易 需要将选项添加到表中 问题是 我不知道如何添加CASCADE
  • 使用聚合函数时减少 Athena 扫描的数据量

    以下查询扫描 100 MB 的数据 select from table where column1 val and partition id 20190309 然而 下面的查询扫描了 15 GB 的数据 有超过 90 个分区 select
  • 无效的 PDO 查询不会返回错误

    下面的第二条 SQL 语句在 phpMyAdmin 中返回错误 SET num 2000040 INSERT INTO artikel artikel nr lieferant nr bezeichnung 1 bezeichnung 1
  • 对时间序列数据重新采样

    我有一个以毫秒为单位的时间序列列表 我想对时间序列进行重新采样并对组应用平均值 我如何在 Postgres 中实现它 重新采样 是指聚合一秒或一分钟内的所有时间戳 一秒或一分钟内的所有行形成一组 表结构 date x y z Use dat
  • 如何在 JdbcTemplate 中创建 mySQL 存储过程

    背景 为了解决 MySql 中某些语句只允许在存储过程中出现的问题 我尝试在 JdbcTemplate 提交的 sql 中创建 运行然后删除存储过程 一个简单的例子是 这恰好是在 Spring Boot 中 Service public c
  • 批量更新 SQL Server C#

    我有一个 270k 行的数据库 带有主键mid和一个名为value 我有一个包含中值和值的文本文件 现在我想更新表格 以便将每个值分配给正确的中间值 我当前的方法是从 C 读取文本文件 并为我读取的每一行更新表中的一行 必须有更快的方法来做
  • $_SESSION 中保存大量信息可以吗?

    我需要存储许多数组 SESSION以防止从 MySQL 检索信息 可以吗 其中 太多 的信息有多少 SESSION还是没有 太多 谢谢 附 或者更好地使用http php net manual en book memcache php ht
  • PHP 中的嵌套 JSON 输出

    我正在为 iOS 应用程序构建 API 并尝试将 mySQL 数据转换为 JSON 字符串进行处理 所需的输出将需要顶级订单详细信息 例如客户名称和地址 然后是订购的产品子数组 我需要的两个表中有相当多的字段 我希望拥有所有字段 我已经构建
  • 使用 GROUP 和 SUM 的 LINQ 查询

    请帮助我了解如何使用带有 GROUP 和 SUM 的 LINQ 进行查询 Query the database IEnumerable

随机推荐

  • 如何在UnrealEngine虚幻引擎中加载Web页面

    对于非游戏开发团队来讲 在面向非游戏领域的UE项目中嵌入Web页面并实现交互无疑能充分利用现有开发资源和流程 WebUI插件能提供完整的Web页面加载及交互手段 让团队中的UE开发工程师和Web开发工程师能够各司其职 紧密配合 WebUI的
  • python-自动化之进度条估算问题

    在本文中 我将尝试打破有史以来最短 最简洁的文章的记录 因此 不费吹灰之力 我们开始吧 事先声明一下 这只是最简单的进度条 若想运用于代码中 很简单 原文以及视频演示效果 请点这里 tqdm tqdm 介绍 请直接看执行效果 tqdm 是适
  • FFmpeg中可执行文件ffmpeg用法汇总

    从https ffbinaries com downloads 下载最新的4 1版本的Windows 64位FFmpeg FFmpeg是一个快速的音频 视频转换工具 FFmpeg可以作为一个命令行程序单独使用 通过执行以下命令将FFmpeg
  • 彻底解决 PowerBuilder9.0打开OLE控件页崩溃的问题

    使用powerbuilder9 0时 insert coltrol gt ole时 PB崩溃了 今天又遇到这个问题了 原因不知道是安装了哪个软件引起来的 分析了原因 1 PB检索注册表 HKEY CLASSES ROOT CSLID下面的带
  • 驱动的Makefile

    一个典型的编译驱动模块的Makefile文件如下所示 KERN DIR root driver kernel obj m module test o all make C KERN DIR M pwd modules PHONY clean
  • 思考:入侵检测(一)

    2020 03 21 文章 1 没有具体的去描述某个入侵检测的模型 而是从运维的角度 阐述了一些思考 我觉得 这种思考在工业界是非常有用的 并不是那种单纯学术角度的模型 前段时间听了计算机视觉的课程 我也是仔细思考了一下 他们总是能够找出来
  • Linux常用命令(一)目录、文件(系统:CentOS7)

    Linux常用命令 一 目录 文件 系统 CentOS7 一 目录操作 1 结构 root localhost 当前用户 linux系统安装的主机地址 系统根目录 当前用户家目录 2 切换目录 cd 绝对路径 从根目录开始 如 cd opt
  • win10 Jdk 版本切换

    环境信息 系统 Win 10 jdk 7 8 11 安装方式 可执行文件安装 exe 格式 切换步骤 1 jdk 安装后 一般我们会手动添加 JAVA HOME 系统环境变量 然后将 JAVA HOME bin 添加到系统环境变量 Path
  • 【计算机网络笔记】物理层:概念&传输媒体&传输方式

    传输媒体 用来传输数据 物理层 解决在各种传输媒体上传输比特01的问题 物理层给数据链路层提供传输透明比特流的服务 使数据链路层只需要考虑如何完成本层的协议和服务 而不必考虑网络的具体的传输媒体是什么 透明 数据链路层无需知道物理层是如何传
  • 一个类成员函数访问另一个类的私有成员方法(不依靠继承与友元),仅供娱乐 :XD

    class B class A public A double a 0 int b 0 y a x b cout lt lt A is creat lt lt endl A void show cout lt lt A y is lt lt
  • 7-7 12-24小时制 (15 分) (C语言实现)

    题目 思路 直接跟着题目往下写 没有过多思考 后面答案部分正确 才重新写了12点那里的程序 11min 代码 include
  • Java连接mysql数据库和oracle连接数据库驱动对比

    oracle安装复杂 占用空间大 很多人用了oracle之后就不用了 项目需要复现 如何实现 那就使用mysql数据库 mysql数据库安装和一般软件安装毫无区别 另外公司中最常用数据库文件就是保存整个的数据库的文件 这样可以进行不断的维护
  • 【环境配置】Windows10终端和VSCode下能够直接打开Anaconda-Prompt

    很多小伙伴在 Windows 下做深度学习开发的时候 遇到终端没有在 Linux 那么方便 那么我们现在就可以来设置一下 这样我们也可以在文件夹内部右键打开终端 也可以在 VS Code 里面新建一个虚拟环境的控制台 这里主要是针对 Ana
  • 嵌入式Linux入门指南(一)——学习路线篇

    嵌入式Linux入门指南 一 学习路线篇 摘要 文章介绍在Linux入门过程中的学习路线 必看书籍分享 1 开始学习实践Linux之前先清楚如何学习很重要 虽然条条大路通罗马 殊途同归 但是不同的路线要付出的代价 时间成本 显然差别巨大 总
  • C#GDI+编程基础(一:Graphics画布类)

    GDI 存在的意义 将变成与具体硬件实现细节分开 GDI 步骤 获取画布 绘制图像 处理图像 命名空间 using System Drawing 提供对GDI 基本图形功能的访问 using System Drawing Drawing2D
  • 5. Java数据类型

    数据类型 基本类型 整数类型 byte short int long 浮点类型 float double 字符类型 char String 布尔类型 true false public class demo2 public static v
  • 第十三届蓝桥杯Python 大学B组真题详解

    第十三届蓝桥杯Python B组真题详解 试题A 排列字母 试题B 寻找整数 试题C 纸张尺寸 试题D 位数排序 试题E 蜂巢 试题F 消除游戏 试题G 全排列的价值 试题H 技能升级 试题I 最长不下降子序列 最优清零方案 本届比赛 两道
  • 性能测试调优模型、思想和技术

    最近阅读 软件性能测试 分析与调优实践之路 一书 个人认为性能调优章节为整部书的精华 该章节包括了性能测试调优模型 调优思想和调优技术 下面是摘抄整理自书中内容 调优模型 下图为互联网中常见的用户请求的分层转发和处理的过程 在性能调优时就是
  • 5.5 综合案例1.0-电力采集

    综合案例 电力采集 1 简介 1 1 BL0939芯片 1 2 语音合成 1 3 注意事项 2 阿里云端设置 3 测试代码 main py app relay py app led py app elec py app audio py a
  • MySQL表的约束

    目录 约束 概念 分类 非空约束 not null 唯一约束 unique 主键约束 primary key 外键约束 foreign key 继续使用上篇文章https blog csdn net z714405489 article d