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


Posted in MySQL onMay 20, 2021

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 不可见列的资料请关注三水点靠木其它相关文章!

MySQL 相关文章推荐
数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,UNION关键字,连接中ON与WHERE的不同)
Apr 05 MySQL
MySQL 角色(role)功能介绍
Apr 24 MySQL
MySQL InnoDB ReplicaSet(副本集)简单介绍
Apr 24 MySQL
MySQL 存储过程的优缺点分析
May 20 MySQL
MySQL系列之四 SQL语法
Jul 02 MySQL
MySQL 聚合函数排序
Jul 16 MySQL
MySQL七大JOIN的具体使用
Feb 28 MySQL
千万级用户系统SQL调优实战分享
Mar 03 MySQL
Windows 64位 安装 mysql 8.0.28 图文教程
Apr 19 MySQL
MySQL中order by的执行过程
Jun 05 MySQL
Mysql中@和@@符号的详细使用指南
Jun 05 MySQL
MySQL提升大量数据查询效率的优化神器
Jul 07 MySQL
Mysql Online DDL的使用详解
May 20 #MySQL
MySQL 存储过程的优缺点分析
May 20 #MySQL
IDEA 链接Mysql数据库并执行查询操作的完整代码
MySQL 覆盖索引的优点
May 19 #MySQL
MySQL 视图(View)原理解析
超详细教你怎么升级Mysql的版本
详解mysql三值逻辑与NULL
You might like
php 删除一个数组中的某个值.兼容多维数组!
2012/02/18 PHP
解析php中反射的应用
2013/06/18 PHP
TP框架实现上传一张图片和批量上传图片的方法分析
2020/04/23 PHP
jquery中常用的SET和GET$(”#msg”).html循环介绍
2013/10/09 Javascript
javascript基于HTML5 canvas制作画箭头组件
2014/06/25 Javascript
js调试工具Console命令详解
2014/10/21 Javascript
轻松学习Javascript闭包函数
2015/12/15 Javascript
javascript拖拽效果延伸学习
2016/04/04 Javascript
Ajax使用原生态JS验证用户名是否存在
2020/05/26 Javascript
利用yarn实现一个webpack+react种子
2016/10/25 Javascript
React教程之封装一个Portal可复用组件的方法
2018/01/02 Javascript
vue刷新和tab切换实例
2018/02/11 Javascript
一步步教会你微信小程序的登录鉴权
2018/04/09 Javascript
vue组件实现可搜索下拉框扩展
2020/10/23 Javascript
jQuery动态操作表单示例【基于table表格】
2018/12/06 jQuery
JavaScript经典案例之简易计算器
2020/08/24 Javascript
Vue单页面应用中实现Markdown渲染
2021/02/14 Vue.js
[02:48]DOTA2英雄基础教程 拉席克
2013/12/12 DOTA
python 性能优化方法小结
2017/03/31 Python
python+django加载静态网页模板解析
2017/12/12 Python
Python 内置函数进制转换的用法(十进制转二进制、八进制、十六进制)
2018/04/30 Python
用python处理图片之打开\显示\保存图像的方法
2018/05/04 Python
python使用pdfminer解析pdf文件的方法示例
2018/12/20 Python
python 读取Linux服务器上的文件方法
2018/12/27 Python
python3+PyQt5 创建多线程网络应用-TCP客户端和TCP服务器实例
2019/06/17 Python
Django框架反向解析操作详解
2019/11/28 Python
aec加密 php_php aes加密解密类(兼容php5、php7)
2021/03/14 PHP
深入理解HTML的FormData对象
2016/05/17 HTML / CSS
canvas绘制圆角头像的实现方法
2019/01/17 HTML / CSS
L’AGENCE官网:加州女装品牌
2018/06/03 全球购物
物理教学随笔感言
2014/02/22 职场文书
企业年检委托书范本
2014/10/14 职场文书
2015学校年度工作总结
2015/05/11 职场文书
刑事上诉状(量刑过重)
2015/05/23 职场文书
百日宴上的祝酒词
2015/08/10 职场文书
Redis过期数据是否会被立马删除
2022/07/23 Redis