MYSQL————数据库的约束

news2024/9/23 1:35:48

1.约束类型

1.not null:指示某列不能存储null值

2.unique:保证某列的每行必须有唯一值

3.default:规定没有给列赋值时的默认值

4.primary key:not null和unique的结合。确保某列(或两个或多个列的结合)有唯一标识,有助于更容易更快捷的找到表中的一个特定记录。

5.foreign key:保证一个表中的数据匹配另一个表中的值的参照完整性。

6.check:保证列中的值符合指定的条件。对于MYSQL数据库,对check子句进行分析,但是忽略check子句

1.1 not null约束

not null:指示某列不能存储null值

创建表时,指定字段添加约束 

NO表示不能写入null

YES表示可以写入null


 1.当字段指定约束not null时,写入数据时,未写该字段,会报错,报Field '字段' doesn't have a default value,该字段没有默认值,你必须写上一个值

2.not null约束的字段,在写入数据时,不能对该字段写入null,数据库帮我们做了一次校验

3.只有当非空列有值时可以写入

1.2 unique (唯一约束)

指定某列为唯一的,不重复的:

 create table test(
    -> id int unique,
    -> name varchar(20)
    -> );

约束id字段为唯一的,不重复的


当test表中有了一条id为1,name为张三的数据,再插入一条id为1,name为李四的数据时,会报id重复的警告


当指定字段被unique约束时,插入的数据可以为null,当再次插入null的数据时,不会报错null可以重复插入

1.3default (默认约束)

规定没有给列赋值时的默认值

指定插入数据时,name为空,默认为无名氏

create table test(
    -> id int,
    -> name varchar(10) default'无名氏'
    -> );

当为某列设置了默认约束的时候,如果不给这个列指定值才会使用默认约束

虽然指定了默认约束,但是当我们手动指定这一列的值为null时,插入的值依然为null,因为这个null是我们手动指定的,可以理解为我们想要的值

用户指定的优先级要高于默认约束

1.4primary key(主键约束)

指定id列为主键

 create table test(
    -> id int primary key,
    -> name varchar(20)
    -> );

primary key是not null与unique的结合,确保某列(或两列或多个列的结合)有唯一标识,有助于更容易更快速的找到表中的一个特定记录

主键约束的列即使非空的,也是唯一的

列被标识为PRI,表示他是一个主键

1.写入数据时,两个约束同时生效

2.主键约束帮我们校验了非空和唯一,这两个校验在写入数据时对效率有一定影响,比起不做校验,这个性能消耗是可以承担的

3.建议为每一张表定义一个主键


auto_increment

对于整数类型的主键,常配搭自增长auto_increment来使用。插入数据对应字段不给值时,使用最大值+1。

 create table test(
    -> id int primary key auto_increment,
    -> name varchar(20)
    -> );

 让数据库帮我们去维护主键的增长,不用程序员自己去计算了,在插入的时候先找到最大的值,然后在这个基础上加1,生成一个新的值,作为新一个数据行主键id列的值


 全列插入

设置了自增主键之后,发现写入null时,也可以成功的插入数据

这里并不是说把null写入数据库了,而是说让数据库帮我们处理这个列的值(自增操作) 


指定列插入

 当删除前两条数据后,再插入数据,id列会在删除的最后一条数据上加一作为新的数据的id值,以上现象是有delete造成的

delete:delete即使删除全部数据,他并不会改变表的结构,可以回滚,所以你主键记录到的值是从之前的开始往下记录的

主键值可以自己添加,只要和之前的不同就行,所以主键值在数据1表有可能是不连续的

当再次添加数据时

 对于我们插入的数据,数据库会自动帮我们进行排序(在自增操作下)


一个表中不允许有两个主键

但是一个主键可以包含多个列(复合主键) 

在唯一校验时,只有复合主键中所有的列都相同才会被判定为相同 

主键的值时定义主键时,多个列值的组合

 1.5 foreign key 

保证一个表中的数据匹配另一个表中的值的参照完整性

 表中某个列的值,必须是另一张表中的主键列,或是唯一约束列的值,也就是当前表中的值必须在另一张表中存在,且满足主键或唯一约束


创建班级表和学生表

CREATE TABLE class(
id int PRIMARY KEY auto_increment,
name varchar(20)
);

CREATE TABLE student(
id int PRIMARY KEY auto_increment,
name VARCHAR(20) not NULL,
class_id int 
);

当前表没有设置主外键关系


外键用于关联其他表的主键或唯一键

语法:

foreign key (字段名)references 主表(列)
 create table student(
    -> id int primary key auto_increment,
    -> name varchar(20) not null,
    -> class_id int,
    -> foreign key(class_id)references class(id)
    -> );

1.foreign key:创建外键的关键字

2.class_id:表示当前表中class_id这个字段要与主表建立主外键关系

3.references:关键字,表示后面要引用哪个表中的哪个列

4.class(id):指定主表和相应的列


 通过外键约束,保证数据的完整性和关系的正确性


删除主表的数据

1.删除主表数据,会报一个主外键关系的错误

2.如果要删除主表中的记录,子表中不能有对该条记录的依赖,也就意味着要先删除子表中的记录,再去删除主表中的记录

 

1.5 check

保证列中的值符合指定的条件。对于MYSQL数据库,对check子句进行分析,但是忽略check子句

 1.check关键字是用来检查这个值是否符合check后面的条件的

2.但是mysql8.0.16之前的版本不支持这个约束,所以写了也没什么效果

3.只有从8.0.16开始,check约束才被正式支持可以使用生效

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

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

相关文章

qtcreator的vim模式下commit快捷键ctrl+g,ctrl+c没有反应的问题

首先开启vim后,CtrlG,CtrlC无法用 解决: 工具 -> 选项->FakeVim 转到Ex Command Mapping 搜索Commit 底栏Regular expression 输入commit (理论上可以是随意的单词) 设置好后,以后要运行&#x…

vue+uniapp

#vue支持的语法,基本上可以做uniapp中所使用(指绝大部分) #知识点:插值表达式,响应式,指令,事件,指令修饰符 #拥有一些案例,补充,以及说明了如何在vscode运…

如何在 Android 智能手机上恢复已删除的图片

面对现实,从手机图库中丢失照片总是令人不安的,无论您是无意中删除了它们,还是甚至出于冲动而生气。但是,我们在这里告诉您,与大多数人的看法相反,从画廊中删除图像并不会使它们不可挽回地丢失。以下是一些…

【MySQL进阶之路】内外链接

目录 内连接 外连接 左外连接 右外连接 个人主页:东洛的克莱斯韦克-CSDN博客 内连接 内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选 select 字段 from 表1 inner join 表2 on 连接条件 and 其他条件; 外连接 外连接分为左外连接和…

【Java】—— 数组元素的查找:顺序查找与二分查找

目录 1、顺序查找 2、二分查找 1、顺序查找 在Java编程中,我们经常需要查找数组中某个元素的下标。有时,我们需要找到该元素第一次出现的位置,而有时则需要找到最后一次出现的位置。在本文中,我们将重点介绍如何查找元素第一次出…

AI依赖的隐患:技术能力退化、安全风险与社会不平等的未来

现代科技的浪潮中,ChatGPT等人工智能工具已经成为我们工作和生活的得力助手。然而,当这种便利变成了依赖,潜在的风险开始显现。过度依赖AI不仅可能导致技术能力的严重退化,还可能加剧信息安全问题和社会不平等。让我们深度剖析这三…

智慧社区信息系统建设:数据可视化与原型设计的力量

在数字化浪潮的推动下,智慧社区作为城市治理现代化的重要一环,正以前所未有的速度改变着我们的生活方式。智慧社区信息系统,作为支撑这一变革的核心,不仅要求高效的数据处理能力,还需具备直观的数据展示与强大的用户交…

zdppy+vue3+onlyoffice文档管理系统实战 20240823上课笔记 zdppy_cache框架的低代码实现

遗留问题 1、封装API2、有账号密码3、查询所有有效的具体数据,也就是缓存的所有字段 封装查询所有有效具体数据的方法 基本封装 def get_all(self, is_activeTrue, limit100000):"""遍历数据库中所有的key,默认查询所有没过期的:para…

服务器数据恢复—重建RAID失败导致数据丢失的数据恢复案例

服务器数据恢复环境: 某品牌服务器中有一组由4块SAS磁盘做的RAID5磁盘阵列。该服务器操作系统为windows server,运行了一个单节点Oracle,数据存储为文件系统,无归档。该oracle数据库的数据量不大,oracle数据库内只有一…

【SpringBoot】电脑商城-08-新增收获地址

新增收货地址 1 新增收货地址-创建数据表 1.使用use命令先选中store数据库。 USE store; 2.在store数据库中创建t_address用户数据表。 CREATE TABLE t_address (aid INT AUTO_INCREMENT COMMENT 收货地址id,uid INT COMMENT 归属的用户id,name VARCHAR(20) COMMENT 收货人…

Oracle Linux 7.9 安装minikube体验

1.环境信息 前置所需: 操作系统:Oracle Linux 7.9 虚拟机配置:CPU:4核 内存:4G 容器:docker 26.1.4 安装minikube后环境: minikube: v1.33.1 kubernetes:v1.23.3 minukube体验说明:使用Virtua…

vs code中编写html的配置,插件安装

首先安装vs code 插件安装下面三个: 功能分别是: html css support :就是支持html环境,因为vs code就是一个文本编辑器 live server:自动更新编写的文件在浏览器刷新 auto rename tag:自动修改另一半标签…

火语言RPA流程组件介绍--获取/结束进程

🚩【组件功能】:获取整个进程列表,或者根据进程名/进程ID获取或结束指定的进程 配置预览 配置说明 查找方式 进程名:进程的名称。 进程ID:进程ID标识。 所有进程列表:返回所有当前系统运行的所有进程列表…

Vue的计算属性:methods方法、computed计算属性、watch监听属性

1、methods 方法 在创建的 Vue 应用程序实例中,可以通过 methods 选项定义方法。应用程序实例本身会代理 methods 选项中的所有方法,因此可以像访问 data 数据那样来调用方法。 【实例】在 Vue 应用程序中,使用 methods 选项定义获取用户信…

JLMSR超分算法说明和效果

一、简介 JLMSR是基于加权概率模型构造的一种超分算法,属于传统超分,无需训练,适合硬件化。与传统超分的插值方案最大区别在于基于16*16的块进行上下文概率统计,结合权重进行插值。目前该插值方案已经线性化和整数化,…

适用于应用程序安全的 11 大 DevSecOps 工具

DevSecOps(开发者安全运营)是指将安全最佳实践融入软件开发生命周期的过程,从而实现更好的安全结果。这是提供全面安全基础设施的重要方面。 市场格局:DevSecOps市场竞争激烈。该领域有数百家供应商提供工具,帮助组织…

能实现可算不可见的同态加密技术详解

目录 同态加密的基本概念 同态加密示例 同态加密的原理 同态加密的类型 同态加密的应用场景 同态加密的挑战 小结 同态加密(Homomorphic Encryption,HE)是一种满足密文同态运算性质的加密算法,可以在加密数据上直接执行特定…

【C++ Primer Plus习题】4.8

问题: 解答: #include <iostream> #include <string> using namespace std;typedef struct _Pizza {string companyName;float diameter;float wieght; }Pizza;int main() {Pizza *pnew Pizza;cout << "请输入披萨的直径: ";cin >> p->d…

如何定义、注册以及什么是异步组件?

一. 如何定义异步组件 定义异步组件需要使用vue提供的 defineAsyncComponent() 方法&#xff1a; 注意&#xff1a;通过观察大家也可以发现&#xff0c;所谓的异步组件就相当于给普通组件套了一层外壳(defineAsyncComponent()),当然现在还不能感受到异步组件的魅力&#xff0c…

大模型入门到精通——Prompt Engineering工程

Prompt Engineering 1. Prompt Engineering 的意义 在 LLM&#xff08;大语言模型&#xff09;时代&#xff0c;Prompt Engineering&#xff08;提示工程&#xff09;已经成为开发者与用户的重要技能和概念。随着大模型&#xff08;如 GPT、GLM、BERT 等&#xff09;的快速发…