『 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…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...

Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...