MySQL(六):mysql 约束

news2024/11/24 14:32:10

基本介绍:约束用于确保数据库的数据满足特定的商业规则,约束包括:not null、unique、primary key、foreign key 、check五种。

一、主键的使用(primary key)

字段名 字段类型 primary key

用于唯一的表示表行的数据,当定义主键约束后,该列不能重复。

#主键的使用 primary key


	

INSERT INTO t17 VALUES(1,'tom','tom.suhu.com'),
		(2,'jack','jack.sohu.com');
		
 -- 设定为主键的列不能重复
INSERT INTO t17 VALUES(1,'grace','grace.sohu.com');

SELECT * FROM t17;

-- 主键使用的细节
-- primary key 不能重复且不能为空
INSERT INTO t17 VALUES(NULL,'grace','grace.sohu.com');

-- 一张表中最多只能有一个主键,但可以是复合主键

CREATE TABLE t18(
	id INT PRIMARY KEY,-- id是主键
	`name` VARCHAR(32) PRIMARY KEY, --错误的
	email VARCHAR(32));

-- 复合主键

CREATE TABLE t18(
	id INT,
	`name` VARCHAR(32),
	email VARCHAR(32),
	PRIMARY KEY (id,`name`));-- 复合主键
	
INSERT INTO t18 VALUES(1,'tom','grace.sohu.com');
INSERT INTO t18 VALUES(1,'jack','jack.suhu.com');-- 主键只有部分相同,可以成功
INSERT INTO t18 VALUES(1,'tom','xx.sohu.com'); -- 主键完全相同,不能插入

SELECT * FROM t18;

-- 主键的指定方式有两种
-- 1、直接在字段名后指定: 字段名 字段类型 primary key
-- 2、在表定义最后写primary key(字段名)

-- 查询表中的主键方法desc
DESC t17;
DESC t18;

-- 在实际开发中,每个表往往都会设计一个主键

二、非空(not null)

如果在列上定义了非空 not null,那么在插入数据时,必须为列提供数据

字段名 字段类型 not null

三、unique(唯一)

当定义了唯一约束后,该列值是不能重复的

字段名 字段类型 unique
#unique的使用

CREATE TABLE t20(
	id INT UNIQUE,
	`name` VARCHAR(32),
	email VARCHAR(32));

INSERT INTO t20 VALUES(1,'jack','jack.com');
SELECT * FROM t20
INSERT INTO t20 VALUES(1,'tom','tom.com');

-- unique细节
-- 1、如果没有指定not null,则unique 字段可以有多个null
-- 如果一个列(字段—),是unique not null约束的,那么使用效果类似于primary key
INSERT INTO t20 VALUES(NULL,'tom','tom.com');


-- 2、一张表可以有多个unique字段
CREATE TABLE t21(
	id INT UNIQUE,
	`name` VARCHAR(32) UNIQUE,
	email VARCHAR(32));
	
DESC t21;
INSERT INTO t21 VALUES(1,'jack','jack.com');

四、外键(foreign key)

用于定义主表和从表之间的关系:外键约束要定义在从表上,主表则必须具有主键约束或是unique约束,当定义外键约束后,要求外键列数据必须在主表的主键列存在或是为null

foreign key (本表字段名) references
主表名(主键名或unique字段名)

在这里插入图片描述

#外键演示

-- 创建主表myclass
CREATE TABLE my_class(
	id INT PRIMARY KEY, -- 班级编号
	`name` VARCHAR(32) NOT NULL DEFAULT ' ');


-- 创建从表my_stu
CREATE TABLE my_stu(
	id INT PRIMARY KEY, -- 学生编号
	`name` VARCHAR(32) NOT NULL DEFAULT ' ',
	class_id INT,
	FOREIGN KEY(class_id) REFERENCES my_class(id));
	

INSERT INTO my_class VALUES(100,'java'),(2,'web');
SELECT * FROM my_class;


INSERT INTO my_stu VALUES(1,'jack',100);

INSERT INTO my_stu VALUES(2,'tom',200); -- 失败,因为200班级不存在
INSERT INTO my_stu VALUES(3,'cindy',2);

SELECT * FROM my_stu;

#注意
-- 1、外键指向表的字段,必须是primary或者unique类型
-- 2、表的类型是innodb,这样的表才支持外键
-- 3、外键字段的类型要和主键字段的类型一致(长度可以不同)
-- 4、外键字段的值,必须在主键字段中出现过,或者为null(前提是外键字段允许为null)
INSERT INTO my_stu VALUES(4,'mary',NULL); -- 可以,外键没有写not null
-- 5、一旦建立主外键的关系,数据不能随意删除
DELETE FROM my_class 
	WHERE id=100;  -- 不能执行,有一个外键指向了100

五、check

用于强制数据必须满足的条件,假定在sal列上定义了check约束,并要求sal列值在1000~2000之间,如果不在这个区间内就会提示出错。
oracle和sql server均支持check名单时mysql5.7不支持,只做语法校验,但不会生效

列名 类型 check(check 条件)

#check演示

CREATE TABLE t23(
	id INT PRIMARY KEY,
	`name` VARCHAR(32),
	sex VARCHAR(6) CHECK(sex IN ('man','woman')),
	sal DOUBLE CHECK(sal>1000 AND sal <2000));
	
INSERT INTO t23 VALUES(1,'mary','man',1000);  -- 失败

INSERT INTO t23 VALUES(1,'mary','kid',2000);   -- 失败

INSERT INTO t23 VALUES(1,'mary','man',1200);   -- 成功

SELECT * FROM t23;

六、案例

在这里插入图片描述


DROP TABLE goods;
DROP TABLE customer;
CREATE TABLE goods(
	goods_id INT PRIMARY KEY,
	goods_name VARCHAR(32),
	unitprice DECIMAL(10,2) CHECK(unitprice >1.0 AND unitprice < 9999.99),
	category INT NOT NULL DEFAULT 0,
	provider VARCHAR(32) NOT NULL DEFAULT ' '
	);


CREATE TABLE customer(
	customer_id INT PRIMARY KEY,
	`name` VARCHAR(32) NOT NULL DEFAULT ' ',
	address VARCHAR(32) NOT NULL DEFAULT ' ',
	email VARCHAR(100) UNIQUE NOT NULL,
	-- sex varchar(32) check(sex in ('man','woman')),
	sex ENUM('man','woman') NOT NULL,
	card_id INT);


CREATE TABLE purchase(
	order_id INT UNSIGNED PRIMARY KEY,
	customer_id INT NOT NULL DEFAULT 0,
	goods_id INT NOT NULL DEFAULT 0,
	nums INT NOT NULL DEFAULT 0,
	FOREIGN KEY (customer_id) REFERENCES customer(customer_id),
	FOREIGN KEY (goods_id) REFERENCES goods(goods_id)
	);

七、自增长

在某张表中,存在一个id列(整数),希望在添加记录的时候,该列从1开始,自动的增长

字段名 整型 primary key auto_increment

添加自增长的字段的方式
insert into XXX(字段1,字段2,..) values(null,'值‘);
insert into XXX(字段2...) values('值1’,'值2');
insert into XXX values(null,’值1')
#演示自增长

-- 创建表
CREATE TABLE t24(
	id INT PRIMARY KEY AUTO_INCREMENT,
	email VARCHAR(32) NOT NULL DEFAULT ' ',
	`name` VARCHAR(32) NOT NULL DEFAULT ' ');

DESC t24

INSERT INTO t24 VALUES(NULL,'jack.com','jack');
INSERT INTO t24 VALUES(NULL,'tom.com','tom');


INSERT INTO t24(email,`name`) VALUES('cindy.com','cindy');
SELECT * FROM t24;

-- 细节
-- 1、auto_increment需要和primary key 或者 unique
-- 2、自增长修饰的字段为整数型(小数很少用)
-- 3、自增长默认从1开始,也可以通过alter table 表名 auto_increment= 新的开始值

CREATE TABLE t25(
	id INT PRIMARY KEY AUTO_INCREMENT,
	email VARCHAR(32) NOT NULL DEFAULT ' ',
	`name` VARCHAR(32) NOT NULL DEFAULT ' ');
ALTER TABLE t25 AUTO_INCREMENT=10;

INSERT INTO t25 VALUES(NULL,'jack.com','jack');
INSERT INTO t25 VALUES(NULL,'tom.com','tom');


INSERT INTO t25(email,`name`) VALUES('cindy.com','cindy');
SELECT * FROM t25;


-- 4、如果添加数据时,给自增长字段指定值,则以指定值为准,其后的值从指定值开始增长,一般来说,就按照自增长的规则来添加数据
INSERT INTO t25 VALUES(666,'grace','grace.com');

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1986449.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot基础 第二天

SpringBoot对静态资源的映射: (1) 要在src/main/resources文件夹下创建static和templates两个文件夹staitc存储静态资源,templates存储模板引擎 (2)要在pom.xml依赖下导入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>…

VS项目打包成lib库并使用

一、新建一个静态库项目 一般要把项目设为Release模式 二、添加文件 将所需要打包的头文件、源文件添加到该静态库项目中 三、生成项目 生成成功后即可在Release文件夹出现找到相应的.lib文件 四、使用静态库 将静态库文件复制到项目文件夹中&#xff0c;然后在项目属性设…

LSV实验——部署DR模式集群

目录 一、实验环境 二、配置 1、LVS 2、router 3、client 4、RS 三、配置策略 1.Director服务器采用双IP桥接网络&#xff0c;一个是VPP&#xff0c;一个DIP 2.Web服务器采用和DIP相同的网段和Director连接 3.每个Web服务器配置VIP 4.每个web服务器可以出外网 一、实验环…

CENTOS9+RSYSLOG+LOGROTATE收集日志

系统版版本为CentOS Stream release 9 rsyslog和lograte通常系统已经安装了。 #rpm -qa | grep rsyslog rsyslog-logrotate-8.2310.0-4.el9.x86_64 rsyslog-8.2310.0-4.el9.x86_64 rsyslog-gnutls-8.2310.0-4.el9.x86_64 rsyslog-gssapi-8.2310.0-4.el9.x86_64 rsyslog-relp-…

常见中间件漏洞(三、Jboss合集)

目录 三、Jboss Jboss介绍 3.1 CVE-2015-7501 漏洞介绍 影响范围 环境搭建 漏洞复现 3.2 CVE-2017-7504 漏洞介绍 影响范围 环境搭建 漏洞复现 3.3 CVE-2017-12149 漏洞简述 漏洞范围 漏洞复现 3.4 Administration Console弱囗令 漏洞描述 影响版本 环境搭建…

Netty技术全解析:ByteToMessageCodec类深度解析

❃博主首页 &#xff1a; 「码到三十五」 &#xff0c;同名公众号 :「码到三十五」&#xff0c;wx号 : 「liwu0213」 ☠博主专栏 &#xff1a; <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 &#xff1a…

Qt/C++最新地图组件发布/历时半年重构/同时支持各种地图内核/包括百度高德腾讯天地图

一、前言说明 最近花了半年时间&#xff0c;专门重构了整个地图组件&#xff0c;之前写的比较粗糙&#xff0c;有点为了完成功能而做的&#xff0c;没有考虑太多拓展性和易用性。这套地图自检这几年大量的实际项目和用户使用下来&#xff0c;反馈了不少很好的建议和意见&#…

【技巧】IDEA 个性化配置

【技巧】IDEA 个性化配置 自动补全 关闭大小写区分 自动导包 插件 Rainbow Brackets 彩色括号 更容易区分是哪个括号

【LVS】负载均衡之NAT模式

一、LVS概念 LVS&#xff08;Linux Virtual Server&#xff09;是一个基于Linux操作系统的虚拟服务器技术&#xff0c;用于实现负载均衡和高可用性。LVS通过将客户端的请求分发到多台后端服务器上&#xff0c;从而提高整体服务的处理能力和可靠性。 二、LVS优势 高性能&…

Centos安装OpenJDK

使用yum包管理器搜索可用的OpenJDK包 sudo yum search openjdk根据你的需求选择合适的OpenJDK版本进行安装 sudo yum install java-1.8.0-openjdk.x86_64安装完成后&#xff0c;验证安装是否成功 java -version

MS2201BP以太网收发电路

MS2201BP 是吉比特以太网收发器电路&#xff0c;可以实现 超高速度的全双工数据传输。它的通信遵从 IEEE 802.3 Gigabit Ethernet 协议中的 10 比特接口的时序要求协 议 。 MS2201BP 支 持 数 据 传 输 速 率 从 1Gbps 到 1.85Gbps 。 主要特点 ◼ 电源电压&#xff…

实验24.创建并挂载文件系统

已完成实验 已完成实验链接 简介 实验 24. 创建并挂载文件系统 总结 创建文件系统: 初始化每一个分区的结构&#xff0c;把扇区划分为超级块&#xff0c;扇区位图&#xff0c;inode 位图&#xff0c;inode 表&#xff0c;根目录&#xff0c;空闲扇区 挂载分区: 创建一个分…

学习STM32(4)--STM32单片机定时器的应用

1 引 言 在STM32单片机的开发中&#xff0c;定时器是一个非常重要的模块&#xff0c;可以用于实现精准的时间控制和周期性的任务。在STM32F103系列单片机中&#xff0c;常见的定时器包括基本定时器、通用定时器和高级定时器。 2 实验目的 1.掌握STM32F103的基本定时器的使…

HAL库源码移植与使用之ADC

ADC类型&#xff1a; F1 F4 H4 H7用的都是逐次递进式 ADC电气特性&#xff1a; 该ADC只能承受3.6v以下电压 F1时钟不能超过14Mhz 流程顺序&#xff1a;先配置好1参考电压和芯片电源&#xff0c;再配置2电压输入通道并通过模拟多路开关选择通路到注入通道或规则通道&#xff0…

Spring AI -快速开发ChatGPT应用

Spring AI介绍 Spring AI是AI工程师的一个应用框架&#xff0c;它提供了一个友好的API和开发AI应用的抽象&#xff0c;旨在简化AI应用的开发工序&#xff0c;例如开发一款基于ChatGPT的对话、图片、音频等应用程序。 Spring AI已经集成了OpenAI的API&#xff0c;因此我们不需…

【虚拟化】KVM使用virt-manager部署及管理虚拟机

目录 一、KVM 概述 二、KVM工作原理 三、部署KVM 四、新建虚拟机步骤 4.1 创建存储池并创建存储卷 4.1.1 创建存储池 4.1.2 创建存储卷 4.3 创建ISO存储池 4.4 生成新的虚拟机 一、KVM 概述 KVM 是 Kernel-based Virtual Machine 的缩写&#xff0c;是一种用于虚拟化的…

LeetCode LCR147.最小栈

LeetCode LCR147.最小栈 思路&#x1f914;&#xff1a; 建立两个栈&#xff0c;一个栈正常入栈出栈&#xff0c;一个栈只用于出入最小数&#xff0c;当push值小于minst栈顶才入栈&#xff0c;当pop值等于minst栈顶才出栈。 代码&#x1f50e;&#xff1a; class MinStack { pu…

如何通过JavaScript提升逻辑判断的可读性?

在前端开发过程中&#xff0c;我们经常会遇到需要根据不同条件执行不同逻辑的场景。对于初学者来说&#xff0c;这样的逻辑判断可能会导致代码冗长且难以维护。那么&#xff0c;如何才能写出既简洁又易读的代码呢&#xff1f;本文将带你逐步优化 JavaScript 中的条件判断&#…

重塑电商新风尚:优选免单策略的深度解析

在当今电商领域&#xff0c;一种创新的销售策略——优选免单模式正悄然兴起。这一模式巧妙融合了价格策略、激励机制与社交互动&#xff0c;旨在激发消费者的购买潜能&#xff0c;引领销售业绩的飞跃式增长。 一、合规创新&#xff0c;重塑激励机制 我们秉承合法合规的原则&am…

API-EXPLORER项目开发笔记(一)

文章目录 前言一、我为什么要做这个项目&#xff1f;二、项目简单介绍三、项目技术栈总结 前言 最近接触到了接口平台这个东西&#xff0c;非常感兴趣&#xff0c;于是就想自己也动手做一个具备核心功能的接口平台&#xff0c;本篇文章主要介绍了做这个项目的初衷以及简单介绍…