MySQL 8.0 之不可见列的基本操作

01 创建不可见列

创建不可见列:

CREATE TABLE `t2` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  `age` int DEFAULT NULL INVISIBLE,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

可以看到,我们的SQL里面创建了一个表t2的字段有id、name和age,其中,age字段设置了不可见属性。

当然,我们可以使用alter table的语法来创建一个不可见列,给t2表中,添加一个score的不可见字段

mysql> alter table t2  add  score int invisible;
Query OK, 0 rows affected (0.05 sec)
Records: 0  Duplicates: 0  Warnings: 0

create table like 的语法能不能完美兼容invisible字段呢?答案是可以的。

mysql> show create table t1\G
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL,
`age` int DEFAULT NULL /*!80023 INVISIBLE */,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

mysql> create table t3 like t1;
Query OK, 0 rows affected (0.09 sec)

mysql> show create table t3\G
*************************** 1. row ***************************
Table: t3
Create Table: CREATE TABLE `t3` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL,
`age` int DEFAULT NULL /*!80023 INVISIBLE */,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

而create table as的语法,默认是不保留invisible列的,如果想保留这个列,请采用下面的方法:

02 不可见列基本操作

我们创建一个t1的表,包含id、name、age3个字段,其中,age字段是invisible的,下面来看几个基本操作:

mysql> insert into t1 values (1,'zhangsan',10);
ERROR 1136 (21S01): Column count doesn't match value count at row 1

mysql> insert into t1 (id,name,age) values (1,'zhangsan',10); 
Query OK, 1 row affected (0.01 sec)

mysql> select * from t1;
+----+----------+
| id | name     |
+----+----------+
|  1 | zhangsan |
+----+----------+
1 row in set (0.00 sec)

首先我们往表t1中插入1条记录,它包含3个字段,发现报错,提示列的数量不对应;

然后我们在插入的时候,补充对应的字段,则发现插入正常了。

但是在使用select * 语法进行查询的时候,发现查询的结果中,只有id 和name两个列,对于age这个invisible的列,默认是不显示的。

当然,我们可以显示使用select来查看这个列:

mysql> select id,name,age from t1;
+----+----------+------+
| id | name     | age  |
+----+----------+------+
|  1 | zhangsan |   10 |
+----+----------+------+
1 row in set (0.00 sec)

03 不可见列元信息

可以通过information_schema来查看某个列是否是不可见列,或者desc + table_name 的命令也可以。如下:

HERE TABLE_SCHEMA = 'test' AND TABLE_NAME = 't1';
+------------+-------------+-----------+
| TABLE_NAME | COLUMN_NAME | EXTRA     |
+------------+-------------+-----------+
| t1         | i           |           |
| t1         | j           |           |
| t1         | k           | INVISIBLE |
+------------+-------------+-----------+

mysql> desc test.t1;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int         | NO   | PRI | NULL    | auto_increment |
| name  | varchar(20) | YES  |     | NULL    |                |
| age   | int         | YES  |     | NULL    | INVISIBLE      |
+-------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

04 用作主键id

看下面这个例子,我们设置主键id为不可见列,这样我们将更多的精力放在表的数据内容相关的字段上,而不必去关心id列,将它隐藏起来:

mysql> use test
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> create table t4 (id int not null auto_increment primary key invisible,name varchar(20),age int );
Query OK, 0 rows affected (0.07 sec)

mysql> insert into t4 values ('zhangsan',10),('lisi',15);
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from t4;
+----------+------+
| name     | age  |
+----------+------+
| zhangsan |   10 |
| lisi     |   15 |
+----------+------+
2 rows in set (0.00 sec)

这种方法有一个很大的好处:假设业务设计的表没有主键,这种表结构DBA肯定不允许,那么DBA就可以在不修改业务逻辑的情况下,将主键设置成一个不可见列,来解决这个表的问题。

以上就是MySQL 8.0 之不可见列的基本操作的详细内容,更多关于MySQL 8.0 不可见列的资料请关注我们其它相关文章!

(0)

相关推荐

  • MySQL8.0.24版本Release Note的一些改进点

    4月20号,MySQL8.0更新了8.0.24这个版本,晚上看了下release note,整理了一些改进点,记录在这里,后续可以下载对应的版本进行测试. 一.连接管理 1.连接信息更详细 之前版本中,如果一个MySQL连接长时间没有和MySQL服务进行交互,则会收到一个MySQL Server has gone away的输出,没有具体的原因信息: 新版的MySQL Server会在连接关闭之前将连接关闭的原因写入到客户端,客户端能够看到更加详细的信息,来分析为什么连接被关闭. 2.连接错误信

  • Java连接MySQL8.0 JDBC的详细步骤(IDEA版本)

    一.导入jar包 1.下载jar包:https://dev.mysql.com/downloads/ 2.导入 在项目文件夹下新建一个名为lib的文件夹 将下载好的jar包放入lib文件夹,然后右击lib文件夹,选择Add as Library...,然后点击ok 二.代码部分 1.加载驱动 Class.forName("com.mysql.cj.jdbc.Driver"); 2.用户信息和url String url = "jdbc:mysql://localhost:33

  • mysql 8.0.24 安装配置方法图文教程

    本文为大家分享了mysql 8.0.24 安装教程,供大家参考,具体内容如下 下载地址:官网 1.解压文件夹 2.配置环境变量,将mysql下的bin目录添加到PATH中: 3.在mysql目录下新建my.ini配置文件 4.修改配置文件 [mysqld] #设置3306端口 port=3306 #设置mysql的安装目录 basedir=D:\MySQL\mysql-8.0.24\ #设置mysql数据库的数据的存放目录 datadir=D:\MySQL\mysql-8.0.24\data\

  • MySQL 8.0新特性 — 检查性约束的使用简介

    前言 在MySQL 8.0版本中,引入了一个非常有用的新特性 - 检查性约束,它可以提高对非法或不合理数据写入的控制能力:接下来我们就来详细了解一下. 检查性约束 创建.删除与查看 (1)可以在建表时,创建检查性约束 mysql> CREATE TABLE t1 -> ( -> CHECK (c1 <> c2), -> c1 INT CHECK (c1 > 10), -> c2 INT CONSTRAINT c2_positive CHECK (c2 >

  • 详解分析MySQL8.0的内存消耗

    在MySQL8.0在启动的时候,会配置各种各样的buffer和cache来提高数据库的性能.如果我们在一台服务器上配置了MySQL8.0的服务,那么这台服务器的内存会同时被操作系统.MySQL8.0服务.以及其他应用程序所共享. 生产环境中,经常会遇到内存的报警,在处理这些报警之前,你需要知道MySQL本身消耗内存最多的点在哪里,这样才能比较直观的判断出来你的MySQL服务占用的内存有多少,以及如何降低MySQL本身的内存消耗. 在MySQL配置文件中,最常用的两个内存相关的参数是innodb_

  • MySql8.023安装过程图文详解(首次安装)

    首先下载安装包Mysql官网下载地址,Mysql是开源的,所以直接下载就行了. 这是下载步骤: 然后选择: 因为个人使用原因,我选择了这个: 下载之后,解压下载得到的安装包放在自己喜欢的位置,然后设置环境变量: 我是win10系统,就是此电脑-属性-高级系统设置-环境变量: 在系统变量中双击Path,再点击新建: 把解压后的bin目录所在的路径复制进去就行了! 然后重要的一步就是:在解压后的根目录下,新建一个文本文档文件,后缀名改为.ini 如图所示: 以文本文档打开my.ini,写入以下内容

  • MySQL 8.0新特性 — 管理端口的使用简介

    前言 下面这个报错,相信大多数童鞋都遇见过:那么碰到这个问题,我们应该怎么办呢?在MySQL 5.7及之前版本,出现"too many connection"报错,超级用户root也无法登录上去,除了重启实例,没有其他更好的解决办法:不过在MySQL 8.0版本中,是对连接管理做了一些优化,下面我们就来看一下. ERROR 1040 (HY000): Too many connections 连接管理 在MySQL 8.0版本中,对连接管理这一块,是先后做了两个比较大的改变:一个是允许

  • mysql 8.0.24版本安装配置方法图文教程

    本文记录了mysql 8.0.24版本安装配置方法,分享给大家 从Mysql官网下载mysql 下载完成后直接双击进行安装,打开后的页面如下所示: 选择自定义custom,接着下一步 将MySQL Server 展开,添加到右边(点击绿色箭头) 选择安装位置后点击ok 点击Next,点击MySQL Sever,选择后再点击Execute 下载完成后点击下一步(需要等待一小会儿) 直接下一步 下一步 一般情况下选择第二个即可,然后点击下一步 设置密码,设置的密码为默认root的密码 下一步 点击E

  • MySQL8.0.23免安装版配置详细教程

    第一步 下载免安装版Mysql 8.0.23 版本 点击下载MySQL8.0.23压缩包 解压文件,进入\mysql-8.0.23-winx64 文件夹中 解压完全后的目录 第二步 创建txt文件改名为my.ini (后缀修改为ini) 第三步 打开my.ini将以下内容复制进入my.ini [mysql] #设置mysql客户端默认字符集 default-character-set=utf8 [mysqld] #设置3306端口 port =3306 #设置安装目录 basedir=D:\so

  • mysql8.0.23 msi安装超详细教程

    一.下载MySql,安装MySql 官网下载MySql数据库 官网下载链接地址:https://dev.mysql.com/downloads/file/?id=501541 安装MySql 2.1点击运行 2.2 选自定义安装,点击下一步 2.3把MySql Servers添加到右侧,第五步更改安装路径,头铁的人是不怕警告的,所以不要怕 2.4然后一直下一步,到这里设置下密码,记不住那你凉凉(只能再来一遍了) 2.5一直点到finish为止 二.环境配置 1.这里需要配置两个环境变量 1.1新

  • win10下安装mysql8.0.23 及 “服务没有响应控制功能”问题解决办法

    win10下安装mysql 1. 官网下载mysql 网址:https://www.mysql.com/downloads/ download页面往下拉:点击下图红框: 按下图指示操作: 下载之后解压: 解压目录如下图所示: 2. 配置环境变量 此电脑->属性->高级系统设置->环境变量->用户变量中的path(双击)->编辑(添加mysql的安装目录下的bin目录).具体步骤如下图操作: (我一般会将用户变量和系统变量都添加) 3. 配置初始化的my.ini文件(新解压后的

随机推荐