『 MySQL数据库 』数据库之表的约束
文章目录
- 前言 💻
- 空属性约束(非空约束) 🔖
- default约束(默认值约束,缺省) 🔖
- 列描述comment 🔖
- 数字类型长度zerofill 🔖
- 主键primary key 🔖
- 📍 追加主键 📍
- 📍 删除主键 📍
- 📍 复合主键 📍
- 自增长 🔖
- 📍 在InnoDB存储引擎中自增值的跳跃 📍
- 唯一键unique 🔖
- 外键 🔖
前言 💻
数据库是一个用来管理、组织、存储数据的一个工具,一个数据库可以存放大量的数据,而为了存放这些数据并将这些数据进行组织,那么为了便于组织和管理,所存储的数据必然要使用分区以特定的格式进行存储;
而对于各个用户来说用户不一定会将所存储的数据以特定的形式表标准准的进行存放,为了能使用户以更加正确的方式进行存放,数据库中有了一个为表的约束的概念;
表的约束实际上约束的是用户,使用户必须以规定的格式或者类型才能将数据存放进数据库;
空属性约束(非空约束) 🔖
NULL与NOT NULL;
-
NULL默认可以为空(非必填);
语法(例如):
CREATE TABLE IF NOT EXISTS Students(-> name varchar(20) null comment'姓名',-> gender enum('男','女') null comment'性别',-> numbers char(11) null comment'电话号码'-> );其中关键字为
null且若是有comment时这个注释将加在最后;
-
NOT NULL默认不能为空(必填);
语法(例如):
CREATE TABLE IF NOT EXISTS Students(-> name varchar(20) not null comment'姓名',-> gender enum('男','女') not null comment'性别',-> numbers char(11) not null comment'电话号码'-> );其中关键字为
not null且若是有comment时这个注释将加在最后;
当约束为
not null时插入数据不插入当前字段时将会报错;
default约束(默认值约束,缺省) 🔖
-
default该约束为默认值,意思也为缺省值;
语法(例如):
CREATE TABLE IF NOT EXISTS Students(-> name varchar(20) default'xxx' comment'姓名',-> gender enum('男','女') default'男' comment'性别',-> numbers char(11) default'123456' comment'电话号码'-> );

在MySQL的语法中支持default约束与not null约束同时定义(不冲突),
若是这两个约束同时出现,在插入数据时若是没有指定需要插入的数据则使用default约束所指定的缺省值,
若是指定插入数据则使用插入的数据,当然这个数据必须符合该类型,同时该数据不能为NULL,这就是default约束与not null约束共同定义的条件;
CREATE TABLE IF NOT EXISTS Students(-> name varchar(20) not null default'xxx' comment'姓名',-> gender enum('男','女') not null default'男' comment'性别',-> numbers char(11) not null default'123456' comment'电话号码'-> );
insert into Students values(NULL,NULL,NULL) #error 可以缺省不传,但是传入的参数要符合类型且不能为NULL

列描述comment 🔖
列描述通常是在创建一个列(字段)时对该字段的描述(注释);
CREATE TABLE IF NOT EXISTS Students(-> name varchar(20) comment'姓名',-> gender enum('男','女') comment'性别',-> numbers char(11) comment'电话号码'-> );
其中comment即为列描述;
使用desc查看表结构的时候不能看见comment列描述,使用show create table可以;

数字类型长度zerofill 🔖
假设存在一个表,且表内数据类型为int,在使用desc查看表结构时将会看到实际上int类型后跟了一个(11);

当给这个字段加上zerofill属性后将会发现其实就是0填充;

主键primary key 🔖
主键一般是用来约束唯一的字段,它约束了用户在插入该字段的数据不能重复,不能为空,且主键只能有一个;
一般主键字段用来当作一个数据的唯一标识符;
主键一般为整数类型;

📍 追加主键 📍
当一个字段一开始没有设定主键也可以在创建之后设置主键;
但是使用这种方式设定主键时应该注意在此之前应确保该表中的要设为主键的字段不存在重复数据;
alter table table_name modify 字段属性 primary key comment'描述';

如果已经需要成为主键的字段内存在重复的数据时,再将该字段设置为主键时将会报错;

📍 删除主键 📍
alter table table_name drop primary key;
使用该命令可以删除primary key主键,由于表中只能拥有一个主键,所以在删除主键时指定主键即可;
📍 复合主键 📍
在一个表中只能拥有一个主键但不代表一个主键内只能拥有一个字段;
mysql> create table if not exists t4(-> id1 int not null,-> id2 int(5) unsigned zerofill not null,-> name varchar(20) not null default'xxx',-> primary key(id1,id2)-> ); # 将id1与id2设为复合主键mysql> desc t4;
+-------+--------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------------------+------+-----+---------+-------+
| id1 | int(11) | NO | PRI | NULL | |
| id2 | int(5) unsigned zerofill | NO | PRI | NULL | |
| name | varchar(20) | NO | | xxx | |
+-------+--------------------------+------+-----+---------+-------+
从上面可以看出成功的创建出了一个复合主键;
mysql> desc t4;
+-------+--------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------------------+------+-----+---------+-------+
| id1 | int(11) | NO | PRI | NULL | |
| id2 | int(5) unsigned zerofill | NO | PRI | NULL | |
| name | varchar(20) | NO | | xxx | |
+-------+--------------------------+------+-----+---------+-------+
3 rows in set (0.00 sec)mysql> ^C
mysql> insert into t4 values(1,1,'xxx');
Query OK, 1 row affected (0.00 sec)mysql> insert into t4 values(1,2,'xxx');
Query OK, 1 row affected (0.00 sec)mysql> insert into t4 values(2,1,'xxx');
Query OK, 1 row affected (0.00 sec)mysql> insert into t4 values(2,2,'xxx');
Query OK, 1 row affected (0.00 sec)mysql> select * from t4;
+-----+-------+------+
| id1 | id2 | name |
+-----+-------+------+
| 1 | 00001 | xxx |
| 1 | 00002 | xxx |
| 2 | 00001 | xxx |
| 2 | 00002 | xxx |
+-----+-------+------+
4 rows in set (0.00 sec)mysql> insert into t4 values(2,1,'xxx'); #报错
ERROR 1062 (23000): Duplicate entry '2-00001' for key 'PRIMARY'
自增长 🔖
当一个字段需要进行自增长时(例如id主键),则需要一个约束来帮助其进行自增;
在MySQL中auto_increment可以使一个字段内的数据在一次插入时进行自增长+1(不插入该值的情况下);
但是在使用自增长的时候也有一定的条件:
- 任何一个字段要做自增长,前提是本身是一个索引(key栏有值)
- 自增长的字段必须是整数
- 一张表中最多只能有一个自增长
mysql> desc t5;
+-------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(20) | YES | | | |
+-------+------------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)mysql> insert into t5 (name)value('Zhangsan');
Query OK, 1 row affected (0.00 sec)mysql> insert into t5 (name)value('Zhangshan');
Query OK, 1 row affected (0.00 sec)mysql> insert into t5 values(100,'Zhangshan');
Query OK, 1 row affected (0.00 sec)mysql> insert into t5 (name)values('Zhangshang');
Query OK, 1 row affected (0.00 sec)mysql> select * from t5;
+-----+------------+
| id | name |
+-----+------------+
| 1 | Zhangsan |
| 2 | Zhangshan |
| 100 | Zhangshan |
| 101 | Zhangshang |
+-----+------------+
4 rows in set (0.00 sec)
📍 在InnoDB存储引擎中自增值的跳跃 📍
如果表的存储引擎是InnoDB的话当数据插入失败则会出现auto_increment自增值跳跃的情况;

唯一键unique 🔖
一张表中有一般有很多的字段所存储的数据都需要具有唯一性,如(身份证,银行卡号,邮箱)等等;
在MySQL中除了主键以外还存在一个约束为唯一键;
当然唯一键与主键也有很多的不同之处,最主要的一点就是:
- 对于主键来说,一般主键一般是来维护数据的唯一性,在绝大多数情况下主键一般是作每个数据的标识符,使得用户在对该数据进行操作的时候能够通过这个标识符达到精确搜索到该数据;
- 对于唯一键来说,唯一键更多的是在业务上来维护数据的唯一性,如(一个人的邮箱,身份证,银行卡等等);
除了这两点以外,唯一键在使用的性质等等也与主键不同;
- 主键不能为空,唯一键可以为空;
- 一张表中至多只能有
1个主键,而一张表中可以有n个唯一键;
mysql> desc t6;
+-------+--------------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------------------+------+-----+---------+----------------+
| id | int(3) unsigned zerofill | NO | PRI | NULL | auto_increment |
| name | varchar(20) | NO | | NULL | |
| tel | char(11) | YES | UNI | NULL | |
| email | char(20) | YES | UNI | NULL | |
+-------+--------------------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)mysql> insert into t6 (name,tel,email)values('Lihua','123456','12345@xx.com');
Query OK, 1 row affected (0.00 sec)mysql> insert into t6 (name,tel,email)values('Zhangsan','123456','12345@xx.com');
ERROR 1062 (23000): Duplicate entry '123456' for key 'tel'
mysql> insert into t6 (name,tel,email)values('Zhangsan','123455','12345@xx.com');
ERROR 1062 (23000): Duplicate entry '12345@xx.com' for key 'email'
mysql> insert into t6 (name,tel,email)values('Zhangsan','123455','12344@xx.com');
Query OK, 1 row affected (0.00 sec)mysql> select * from t6;
+-----+----------+--------+--------------+
| id | name | tel | email |
+-----+----------+--------+--------------+
| 001 | Lihua | 123456 | 12345@xx.com |
| 004 | Zhangsan | 123455 | 12344@xx.com | #这里的自增值越过是因为默认存储引擎为InnoDB
+-----+----------+--------+--------------+
外键 🔖
外键是用来维护两个表之间的关系,有些有关联的表可以分为主表和从表;
一般外键约束是在从表上定义,同时当定义外键后,要求外键列数据必须在主表的主键列存在主表的主键列或为null;
forgen key (字段名) reference 主表(列)
mysql> create table if not exists t7_class(-> class_id int(2) unsigned zerofill primary key commentt'专业班级',-> class_name varchar(20) not null comment'班级名字'-> );
Query OK, 0 rows affected (0.01 sec)mysql> desc t7_class-> ;
+------------+--------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------------------+------+-----+---------+-------+
| class_id | int(2) unsigned zerofill | NO | PRI | NULL | |
| class_name | varchar(20) | NO | | NULL | |
+------------+--------------------------+------+-----+---------+-------+
2 rows in set (0.00 sec)mysql> insert into t7_class values(1,'计科一班');
Query OK, 1 row affected (0.00 sec)mysql> insert into t7_class values(2,'计科二班');Query OK, 1 row affected (0.00 sec)mysql> select * from t7_class;
+----------+--------------+
| class_id | class_name |
+----------+--------------+
| 01 | 计科一班 |
| 02 | 计科二班 |
+----------+--------------+mysql> create table if not exists t7_stu(-> id int(3) unsigned zerofill primary key auto_increment comment'设置主键',-> name varchar(20) not null comment'姓名',-> class int(2) unsigned zerofill comment'外键',-> foreign key (class) references t7_class(class_id)-> );
Query OK, 0 rows affected (0.01 sec)mysql> system clear;
此时主表与从表的外键关系已经创建完毕;
mysql> show create table t7_class\G #查看该表详细信息
*************************** 1. row ***************************Table: t7_class
Create Table: CREATE TABLE `t7_class` (`class_id` int(2) unsigned zerofill NOT NULL COMMENT '专业班级',`class_name` varchar(20) NOT NULL COMMENT '班级名字',PRIMARY KEY (`class_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)mysql> show create table t7_stu\G #查看该表详细信息
*************************** 1. row ***************************Table: t7_stu
Create Table: CREATE TABLE `t7_stu` (`id` int(3) unsigned zerofill NOT NULL AUTO_INCREMENT COMMENT '设置主键',`name` varchar(20) NOT NULL COMMENT '姓名',`class` int(2) unsigned zerofill DEFAULT NULL COMMENT '外键',PRIMARY KEY (`id`),KEY `class` (`class`),CONSTRAINT `t7_stu_ibfk_1` FOREIGN KEY (`class`) REFERENCES `t7_class` (`class_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
插入数据时从表中建立外键约束的字段插入数据时只能是主表内对应的数据或者为空,否则将报错;
mysql> desc t7_class;
+------------+--------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------------------+------+-----+---------+-------+
| class_id | int(2) unsigned zerofill | NO | PRI | NULL | |
| class_name | varchar(20) | NO | | NULL | |
+------------+--------------------------+------+-----+---------+-------+
2 rows in set (0.00 sec)mysql> desc t7_stu;
+-------+--------------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------------------+------+-----+---------+----------------+
| id | int(3) unsigned zerofill | NO | PRI | NULL | auto_increment |
| name | varchar(20) | NO | | NULL | |
| class | int(2) unsigned zerofill | YES | MUL | NULL | |
+-------+--------------------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)mysql> insert into t7_stu (name,class)value('Lihua',01);
Query OK, 1 row affected (0.00 sec)mysql> insert into t7_stu (name,class)value('Lihua',02);
Query OK, 1 row affected (0.00 sec)mysql> insert into t7_stu (name,class)value('Liming',03);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`test`.`t7_stu`, CONSTRAINT `t7_stu_ibfk_1` FOREIGN KEY (`class`) REFERENCES `t7_class` (`class_id`))
mysql> select * from t7_stu;
+-----+-------+-------+
| id | name | class |
+-----+-------+-------+
| 001 | Lihua | 01 |
| 002 | Lihua | 02 |
+-----+-------+-------+
2 rows in set (0.00 sec)mysql> 相关文章:
『 MySQL数据库 』数据库之表的约束
文章目录 前言 💻空属性约束(非空约束) 🔖default约束(默认值约束,缺省) 🔖列描述comment 🔖数字类型长度zerofill 🔖主键primary key 🔖📍 追加主键 📍📍 删除主键 &…...
flink 8081 web页面无法被局域网内其他机器访问
实现 http://localhost:8081/#/overview 可以被局域网其他机器访问...
零基础安装分布式数据服务注册系统
一、先安装VM虚拟机,安装最新的ubuntu22系统, 先安装mysql, sudo apt install mysql-server sudo mysql_secure_installation 根据自己需求选择 密码安全级别时,选择n 删除匿名用户?(按y|Y表示是&…...
2023最新最全【OpenMV】 入门教程
1. 什么是OpenMV OpenMV 是一个开源,低成本,功能强大的 机器视觉模块。 OpenMV上的机器视觉算法包括 寻找色块、人脸检测、眼球跟踪、边缘检测、标志跟踪 等。 以STM32F427CPU为核心,集成了OV7725摄像头芯片,在小巧的硬件模块上&a…...
【Java并发编程三】线程的基本使用一
基本使用一 将类继承Runnable,创建Thread,然后调用Thread的start方法启动: package myTest;public class myTest implements Runnable {public static void main(String[] args) throws InterruptedException {myTest test new myTest();Th…...
企业邮箱认证指南:安全与高效的邮箱认证方法
企业邮箱是专门为企业提供的电子邮件服务,安全性和专业性更高。在开始使用企业邮箱之前,很多人会有一些问题,比如企业邮箱需要认证吗、如何开通企业邮箱,以及哪款企业邮箱好。 1、企业邮箱在使用前需要认证吗? 答案是肯…...
Django(八、如何开启事务、介绍长见的字段类型和参数)
文章目录 ORM事务操作开启事务 常见的字段类型和参数ORM还支持用户自定义字段类型ORM常用字段参数外键相关参数 ORM事务操作 引入事务 1.事务的四大特性原子性、一致性、隔离性、持久性 2.相关SQL关键字start transaction;rollback;commit;savapoint; 3.相关重要概念脏读、幻…...
机器学习第5天:多项式回归与学习曲线
文章目录 多项式回归介绍 方法与代码 方法描述 分离多项式 学习曲线的作用 场景 学习曲线介绍 欠拟合曲线 示例 结论 过拟合曲线 示例 结论 多项式回归介绍 当数据不是线性时我们该如何处理呢,考虑如下数据 import matplotlib.pyplot as plt impo…...
MSYS2介绍及工具安装
0 Preface/Foreword 1 MSYS2 官网:MSYS2...
Swift开发中:非逃逸闭包、逃逸闭包、自动闭包的区别
1. 非逃逸闭包(Non-Escaping Closure) 定义:默认情况下,在 Swift 中闭包是非逃逸的。这意味着闭包在函数结束之前被调用并完成,它不会“逃逸”出函数的范围。内存管理:由于闭包在函数返回前被调用…...
栈结构应用-进制转换-辗转相除法
// 定义类class Stack{// #items [] 前边加#变为私有 外部不能随意修改 内部使用也要加#items []pop(){return this.items.pop()}push(data){this.items.push(data)}peek(){return this.items[this.items.length-1]}isEmpty(){return this.items.length 0}size(){return th…...
【Azure 架构师学习笔记】-Azure Storage Account(6)- File Layer
本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Storage Account】系列。 接上文 【Azure 架构师学习笔记】-Azure Storage Account(5)- Data Lake layers 前言 上一文介绍了存储帐户的概述,还有container的一些配置,在…...
idea 环境搭建及运行java后端源码
1、 idea 历史版本下载及安装 建议下载和我一样的版本,2020.3 https://www.jetbrains.com/idea/download/other.html,idea分为专业版本(Ultimate)和社区版本(Community),前期可以下载专业版本…...
掌握Shell:从新手到编程大师的Linux之旅
1 shell介绍 1.1 shell脚本的意义 1.记录命令执行的过程和执行逻辑,以便以后重复执行 2.脚本可以批量处理主机 3.脚本可以定时处理主机 1.2 脚本的创建 #!/bin/bash # 运行脚本时候执行的环境1.3 自动添加脚本说明信息 /etc/vimrc # vim主配置文件 ~/.vimrc # 该…...
有重复元素的快速排序
当涉及到处理重复元素的快速排序时,可以使用荷兰国旗问题的方法,也就是三路划分。下面是使用 Java 实现的示例代码: import java.util.Arrays;public class QuickSort {public static void quickSort(int[] arr, int low, int high) {if (lo…...
Bert浅谈
优点 首先,bert的创新点在于利用了双向transformer,这就跟openai的gpt有区别,gpt是采用单向的transformer,而作者认为双向transformer更能够融合上下文的信息。这里双向和单向的区别在于,单向只跟当前位置之前的tocke…...
产品运营的场景和运营策略
一、启动屏 1.概念 启动屏,特指 APP 产品启动时即显示的界面,这个界面一般会停留几秒钟时间,在这个时间内 APP 会在后台加载服务框架、启动各种服务 SDK 、获取用户地理位置、判断有无新版本、判断用户账户状态以及其他系统级别的…...
C#异常捕获try catch详细介绍
在C#中,异常处理是通过try、catch、finally和throw语句来实现的,它们提供了一种结构化和可预测的方法来处理运行时错误。 C#异常基本用法 try块 异常处理以try块开始,try块包含可能会引发异常的代码。如果在try块中的代码执行过程中发生了…...
切换阿里云ES方式及故障应急处理方案
一、阿里云es服务相关问题及答解 1.1 ES7.10扩容节点时间 增加节点数量需要节点拉起和数据Rebalance两步,拉起时间7.16及以上的新版本大概10分钟以内,7.16以前大概一小时,数据迁移的时间就看数据量了,一般整体在半小时以内 (需进行相关测试验证) 1.2 ES7.10扩容数据节点…...
CTFhub-RCE-过滤空格
1. 查看当前目录:127.0.0.1|ls 2. 查看 flag_890277429145.php 127.0.0.1|cat flag_890277429145.php 根据题目可以知道空格被过滤掉了 3.空格可以用以下字符代替: < 、>、<>、%20(space)、%09(tab)、$IFS$9、 ${IFS}、$IFS等 $IFS在li…...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...
